Вопрос

Я хочу посчитать города по полу, как это;

City    GenderFCount  GenderMCount
Redmond 10             20   

Вот мой запрос получает город и пол в базе данных AdventureWorks

select Gender,City from HumanResources.Employee as t1
    inner join HumanResources.EmployeeAddress as t2
    on t1.EmployeeID = t2.EmployeeID
    inner join Person.Address as t3
    on t2.AddressID = t3.AddressID

Если возможно, вы можете показать решение во многих отношениях, как «Pivot», по функциям SQL (UDF), сохраненная процедура или другие способы.

Спасибо

Это было полезно?

Решение

Вот поворотный запрос, вы можете бросить, что в сохраненной процедуре или UDF

select City, F as GenderFCount, M as GenderMCount
 from(
select Gender,City
from HumanResources.Employee as t1
    inner join HumanResources.EmployeeAddress as t2
    on t1.EmployeeID = t2.EmployeeID
    inner join Person.Address as t3
    on t2.AddressID = t3.AddressID
    ) AS pivTemp
PIVOT
(   count(Gender)
    FOR Gender IN ([F],[M])
) AS pivTable

Пример UDF

CREATE FUNCTION fnPivot()
RETURNS TABLE

AS
RETURN (
select City, F as GenderFCount, M as GenderMCount
 from(
select Gender,City
from HumanResources.Employee as t1
    inner join HumanResources.EmployeeAddress as t2
    on t1.EmployeeID = t2.EmployeeID
    inner join Person.Address as t3
    on t2.AddressID = t3.AddressID
    ) AS pivTemp
PIVOT
(   count(Gender)
    FOR Gender IN ([F],[M])
) AS pivTable
)
GO

Теперь вы можете назвать это так, как это

 SELECT * FROM dbo.fnPivot()

Другие советы

Здесь он использует CTE, встроенный в процедуру. Теперь я использую AdventureWorks 2012, потому что это все, что у меня есть. Но концепция одинакова.

    USE [AdventureWorks]
    GO
    /****** Object:  StoredProcedure [dbo].[GenderCountbyCity]    Script Date: 4/20/2016 9:07:04 AM ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    ALTER PROCEDURE [dbo].[GenderCountbyCity]

    AS

    BEGIN

    ;WITH EmpF
            AS (
                    SELECT pa.City, hre.Gender, COUNT(hre.Gender) AS CountF
                            FROM Person.BusinessEntityAddress pbea
                                    JOIN Person.Address pa
                                            ON pbea.AddressID = pa.AddressID
                                    JOIN HumanResources.Employee hre
                                            ON pbea.BusinessEntityID = hre.BusinessEntityID
                            WHERE hre.Gender = 'F'
                            GROUP BY pa.City, hre.Gender
                    ),

    EmpM
            AS (
                    SELECT pa.City, hre.Gender, COUNT(hre.Gender) AS CountM
                            FROM Person.BusinessEntityAddress pbea
                                    JOIN Person.Address pa
                                            ON pbea.AddressID = pa.AddressID
                                    JOIN HumanResources.Employee hre
                                            ON pbea.BusinessEntityID = hre.BusinessEntityID
                            WHERE hre.Gender = 'M'
                            GROUP BY pa.City, hre.Gender
                    )

    SELECT COALESCE(EmpF.City,EmpM.City) AS City, COALESCE(EmpF.CountF,0) AS GenderFCount, COALESCE(EmpM.CountM,0) AS GenderMCount
            FROM EmpF
                    FULL JOIN EmpM
                            ON EmpF.City = EmpM.City
            ORDER BY COALESCE(EmpF.City,EmpM.City)

    END

Если вы хотите создать, а не изменить, процедуру, просто измените «изменить» на «создать». Затем обновите свой список сохраненных процедур, и вы можете изменить его оттуда. После этого «Create» автоматически показывает «изменение», и любые изменения будут сохранены при ударе F5, если он успешен. Затем вы можете набрать EXEC DBO.GenderCountByCity (или все, что есть ваше имя) [или просто щелкните правой кнопкой мыши процедуру и выберите «Выполнить хранимую процедуру»], и вы получите результаты.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top