Frage

Ich will die Städte nach Geschlecht zählen, wie diese;

City    GenderFCount  GenderMCount
Redmond 10             20   

Hier ist meine Abfrage bekommt Stadt und Geschlecht in Adventureworks-Datenbank

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

Wenn es möglich ist, könnte man die Lösung in vielerlei Hinsicht zeigen, wie "PIVOT", die von SQL-Funktion (UDF), Stored Procedure oder andere Weise.

Dank

War es hilfreich?

Lösung

Dies ist die PIVOT Abfrage Sie, dass in einer gespeicherten Prozedur oder UDF

Dump kann
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

Beispiel für die 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

Jetzt können Sie es so nennen

 SELECT * FROM dbo.fnPivot()

Andere Tipps

Hier ist es ein CTE Verwendung in einem Verfahren eingebettet. Nun, ich bin mit Adventureworks 2012, denn das ist alles, was ich habe. Aber das Konzept ist das gleiche.

    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

Wenn Sie erstellen möchten, anstatt alter, ein Verfahren, ändern Sie einfach „ALTER“ auf „CREATE“. Dann aktualisieren Sie Ihre Liste der gespeicherten Prozeduren und Sie können es von dort ändern. Danach zeigt die „Create“ automatisch „ALTE“ und alle Änderungen gespeichert werden, wenn Sie F5 treffen, wenn es erfolgreich ist. Dann können Sie EXEC dbo.GenderCountbyCity eingeben (oder was auch immer Ihr Name ist) [oder einfach nur das Verfahren der rechten Maustaste und wählen Sie Execute Stored Procedure] und Sie werden die Ergebnisse erhalten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top