Общий итог SQL Server в группе по - PullRequest
1 голос
/ 01 мая 2019

В моем запросе к SQL Server я пытаюсь подсчитать количество сотрудников на сайт.Это работает, но когда я пытаюсь добавить процент от общего количества, он по-прежнему группируется по сайту, поэтому он неточен.

Есть ли более простой способ добиться этого?

Я использую этот запрос для создания представления.

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 ]

3 голосов
/ 01 мая 2019

Вы можете использовать подзапрос:

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 голосов
/ 01 мая 2019

Сценарий создания данных declare @Employee Table(EmployeeID int ,ActiveStatus nvarchar(20) ,SiteID int) declare @Site Table(SiteName nvarchar(20) ,SiteID int) insert into @Employee values(1,'Yes',101),(2,'Yes',101),(3,'Yes',102),(4,'Yes',102), (5,'Yes',101)

insert into @Site values('Site1',101)
insert into @Site values('Site2',102)

// реальный сценарий для получения процента% ;with cte as ( select s.SiteName,sum(case when e.ActiveStatus = 'Yes' then 1 else 0 end) as "NumberOfEmployees" from @Employee e left join @Site s on(e.SiteID=s.SiteID) GROUP BY s.SiteName ), cte_sum as (select sum(NumberOfEmployees) as total from cte ) select c.*, convert (decimal(6,2),c.NumberOfEmployees)/convert (decimal(6,2),cs.total)*100 from cte_sum cs, cte c;

0 голосов
/ 01 мая 2019

Этот скрипт должен помочь -

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 голосов
/ 01 мая 2019

Я не могу дать ответ для вашего сценария, поскольку у меня нет образцов данных для использования, поэтому я предоставил небольшой набор данных.

Один из способов - использовать CTE / подзапросчтобы получить общее число, а затем включить сумму в GROUP BY.Этот метод позволяет избежать 2 сканирования таблицы:

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...