1
votes

Total total de SQL Server dans un groupe par

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


0 commentaires

4 Réponses :


3
votes

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;


0 commentaires

0
votes

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;


0 commentaires

0
votes

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;


0 commentaires

0
votes

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;


0 commentaires