SQL-запрос: множественное выделение и суммы в одной таблице - PullRequest
0 голосов
/ 27 апреля 2018

У меня есть таблица со следующей структурой, и я пытаюсь выбрать всех сотрудников, сгруппированных менеджером, с суммой типа рабочего часа и общего количества часов за месяц.

[ID] - Int    
[ActualHours] - nvarchar(MAX)  
[TimeType] - nvarchar(MAX)  
[Cost] - nvarchar(MAX)  
[EmployeeName] - nvarchar(MAX)  
[SupervisorName] - nvarchar(MAX)  
[SupervisorNumber] - nvarchar(MAX)  
[Period] - nvarchar(MAX)  
[TaskName] -nvarchar(MAX)

Образец таблицы данных:

+------+-------------+-------------+------------+------------------+------------+------------------+--------------+--------------+---------------+
|  ID  | ActualHours |  TimeType   |    Cost    |   EmployeeName   | EmployeeID |  SupervisorName  | SupervisorID |    Period    |   TaskName    |
+------+-------------+-------------+------------+------------------+------------+------------------+--------------+--------------+---------------+
| 8    |    7.5      |    Regular  |    18      |  Jones, Fred     |  42        |  Marks ,Thomas   |       54     |    Dec-17    |  Delivery     |
| 8    |    22.5     |    Regular  |    25      |  Smith, Bill     |  54        |  Doe ,John       |       12     |    Dec-17    |  Accounts     |
| 8    |    12.5     |    OT       |    22      |  Hinckly, Debra  |  66        |  Marks ,Thomas   |       54     |    Dec-17    |  Shipping     |
| 8    |    7.5      |    Regular  |    18      |  Jones, Fred     |  42        |  Marks ,Thomas   |       54     |    Dec-17    |  Returns      |
| 8    |    7.5      |    OT       |    27      |  Jones, Fred     |  42        |  Marks ,Thomas   |       54     |    Dec-17    |  Recievables  |
| 8    |    2.5      |    OT       |    27      |  Jones, Fred     |  42        |  Marks ,Thomas   |       54     |    Dec-17    |  Transfers    |
+------+-------------+-------------+------------+------------------+------------+------------------+--------------+--------------+---------------+

Я пытаюсь добиться того, чтобы запрос возвращал следующие результаты:

+----------------+----------------+-----------------+------------+------------+----------+--------+
| SupervisorName |  EmployeeName  | TimeTypeRegular | TimeTypeOT | TotalHours | TaskCost | Period |
+----------------+----------------+-----------------+------------+------------+----------+--------+
| Marks ,Thomas  | Jones, Fred    |              15 |        9.5 |       24.5 |      270 | Dec-17 |
| Doe ,John      | Smith, Bill    |            22.5 |          0 |       22.5 |    562.5 | Dec-17 |
| Marks ,Thomas  | Hinckly, Debra |               0 |       12.5 |       12.5 |      275 | Dec-17 |
+----------------+----------------+-----------------+------------+------------+----------+--------+

Я пробовал следующее, но я не могу получить как сумму обычных часов, так и часов OT и общую сумму в одном запросе.

select SupervisorName, EmployeeName,  TimeType, SUM(convert(decimal(10,2),ActualHours)) As TotalHours, Period
from TableName
where TimeType = 'Regular' and Period = 'Dec-17'
group by EmployeeName, EmployeeID, SupervisorName

Я использую MS SQL Server 2017. Любая помощь приветствуется.

Ответы [ 2 ]

0 голосов
/ 27 апреля 2018

Попробуйте это:

SELECT 
    SupervisorName, 
    EmployeeName,  
    SUM(CASE WHEN TimeType = 'Regular' THEN convert(decimal(10,2),ActualHours) ELSE 0 END) AS TimeTypeRegular, 
    SUM(CASE WHEN TimeType = 'OT' THEN convert(decimal(10,2),ActualHours) ELSE 0 END) AS TimeTypeRegular,
    SUM(convert(decimal(10,2),ActualHours)) totalHours,
    Period
FROM 
    TableName
GROUP BY 
    EmployeeName, EmployeeID, SupervisorName, Period

Удалено условие периода из предложения where и добавлено то же самое в условии group by -> Дает требуемый результат за весь период времени. Если вы хотите получить результат только для определенного месяца, добавьте фильтр периодов в предложении where

0 голосов
/ 27 апреля 2018

Вы можете использовать оператор case внутри агрегатной функции SUM, чтобы отфильтровать, какие строки суммируются:

select SupervisorName, EmployeeName,  TimeType, 
    SUM( CASE TimeType WHEN 'Regular' THEN convert(decimal(10,2),ActualHours) ELSE NULL END ) AS TimeTypeRegular,
    SUM( CASE TimeType WHEN 'OT' THEN convert(decimal(10,2),ActualHours) ELSE NULL END ) AS TimeTypeOT,
    SUM(convert(decimal(10,2),ActualHours)) As TotalHours, Period
from TableName
where TimeType = 'Regular' and Period = 'Dec-17'
group by EmployeeName, EmployeeID, SupervisorName
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...