В моем запросе к 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
1
Conor8630 1 Май 2019 в 12:52

3 ответа

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

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
mkRabbani 1 Май 2019 в 10:21

Скрипт создания данных объявляет таблицу @Employee (EmployeeID int, ActiveStatus nvarchar (20), SiteID int) объявить @Site Table (SiteName nvarchar (20), SiteID int) вставить в значения @Employee (1, «Да», 101), (2, «Да», 101), (3, «Да», 102), (4, «Да», 102), ( 5 , ' Да ' , 101 )

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

// реальный скрипт для получения% процента ; cte as ( выберите s.SiteName, sum (случай, когда e.ActiveStatus = 'Yes', затем 1 else 0 end) в качестве "NumberOfEmployees" от @Employee e осталось присоединиться @Site s на ( e.SiteID = s.SiteID ) GROUP BY s.SiteName ) , cte_sum as (выберите сумму (NumberOfEmployees) как общую сумму от cte) выберите c. *, преобразовать (десятичное число (6,2), c.NumberOfEmployees) / преобразовать (десятичное число (6,2), cs.total) * 100 из cte_sum cs, cte c;

0
Chirag 1 Май 2019 в 12:46

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

Один из методов - использовать 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;
0
Larnu 1 Май 2019 в 09:57