SQL Adventure zählen Mitarbeiter nach Geschlecht nach Stadt
-
30-09-2019 - |
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
Lösung
Dies ist die PIVOT Abfrage Sie, dass in einer gespeicherten Prozedur oder UDF
Dump kannselect 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.