Dans ma requête SQL Server, j'essaie de compter le nombre d'employés par site. Cela fonctionne, mais lorsque j'essaie d'ajouter un pourcentage du total, il est toujours regroupé par site, il est donc inexact.
Existe-t-il un moyen plus simple d'y parvenir?
J'utilise cette requête pour créer une vue.
select Site.SiteName, sum(case when Employee.ActiveStatus = 'Yes' then 1 else 0 end) as "NumberOfEmployees", CONVERT(decimal(6,2),(sum(case when Employee.ActiveStatus = 'Yes' then 1 else 0 end))/(convert(decimal(6,2),COUNT(EmployeeID)))) as PercentageOfEmps from Employee left join Site on(Employee.SiteID=Site.SiteID) GROUP BY Site.SiteName; GO
4 Réponses :
Vous pouvez utiliser la sous-requête:
select Site.SiteName, NumberOfEmployees = sum(case when Employee.ActiveStatus = 'Yes' then 1 else 0 end), PercentageOfEmps = CONVERT(decimal(6,2),(sum(case when Employee.ActiveStatus = 'Yes' then 1 else 0 end))/(SELECT COUNT(EmployeeID) FROM Employee) from Employee left join Site on Employee.SiteID=Site.SiteID GROUP BY Site.SiteName;
Je ne peux pas fournir de réponse pour votre scénario, car je n'ai pas d'exemples de données à utiliser, j'ai donc fourni un petit ensemble de données.
Une méthode consiste à utiliser un CTE / sous-requête pour obtenir un nombre total, puis incluez le total dans le GROUP BY . Cette méthode évite 2 scans de la table:
WITH VTE AS(
SELECT *
FROM (VALUES(1,'Steve',1),
(2,'Jayne',1),
(3,'Greg',2),
(4,'Sarah',3)) V(EmpID, EmpName, SiteID)),
CTE AS(
SELECT V.EmpID,
V.EmpName,
V.SiteID,
COUNT(V.EmpID) OVER () AS TotalCount
FROM VTE V)
SELECT C.SiteID,
COUNT(C.EmpID) AS Employees,
COUNT(C.EmpID) / (C.TotalCount *1.0) AS Perc
FROM CTE C
GROUP BY C.SiteID,
C.TotalCount;
Ce script devrait aider -
SELECT
Site.SiteName,
COUNT(EmployeeID) AS [NumberOfEmployees],
((COUNT(EmployeeID)*1.0)/(SELECT COUNT(*) FROM Employee WHERE ActiveStatus = 'Yes'))*100.00 as PercentageOfEmps
FROM Employee
INNER JOIN Site
ON Employee.SiteID = Site.SiteID
WHERE Employee.ActiveStatus = 'Yes'
GROUP BY Site.SiteName;
Script de création de données
déclare la table @Employee (EmployeeID int, ActiveStatus nvarchar (20), SiteID int)
déclarer @Site Table (SiteName nvarchar (20), SiteID int)
insérer dans les valeurs @Employee (1, 'Oui', 101), (2, 'Oui', 101), (3, 'Oui', 102), (4, 'Oui', 102),
(5, 'Oui', 101)
insert into @Site values('Site1',101)
insert into @Site values('Site2',102)
// vrai script pour obtenir le pourcentage de pourcentage
; avec cte comme
(
sélectionnez s.SiteName, sum (cas où e.ActiveStatus = 'Yes' puis 1 else 0 end) comme "NumberOfEmployees"
de @Employee e
rejoindre gauche @Site s
sur (e.SiteID = s.SiteID)
GROUP BY s. Nom du site
),
cte_sum comme
(sélectionnez somme (NumberOfEmployees) comme total de cte)
sélectionnez c. *, convertissez (decimal (6,2), c.NumberOfEmployees) / convert (decimal (6,2), cs.total) * 100 from cte_sum cs, cte c;