SQL AdventureWorks compter les salariés par sexe par ville
-
30-09-2019 - |
Question
Je veux compter les villes par sexe, comme celui-ci;
City GenderFCount GenderMCount
Redmond 10 20
Voici ma question devient ville et le sexe dans la base de données 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
S'il est possible que vous pourriez montrer la solution à bien des égards, comme "PIVOT", par fonction sql (UDF), procédure stockée ou d'autres façons.
Merci
La solution
Voici la requête PIVOT, vous pouvez jeter que dans une procédure stockée ou 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
Exemple de l'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
maintenant, vous pouvez l'appeler comme ça
SELECT * FROM dbo.fnPivot()
Autres conseils
Ici, il utilise un CTE, intégré dans une procédure. Maintenant, j'utilise AdventureWorks 2012, parce que c'est tout ce que j'ai. Mais le concept est le même.
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
Si vous voulez créer, plutôt que de modifier, une procédure, il suffit de changer « ALTER » pour « créer ». Puis rafraîchir la liste des procédures stockées et vous pouvez le modifier à partir de là. Après cela, le « Create » affiche automatiquement « ALTER » et les modifications seront enregistrées lorsque vous appuyez sur F5, si elle est couronnée de succès. Ensuite, vous pouvez taper EXEC dbo.GenderCountbyCity (ou quel que soit votre nom est) [ou tout simplement un clic droit de la procédure et sélectionnez Exécuter une procédure stockée] et vous obtiendrez les résultats.