Я написал заявление select, чтобы помочь с утверждением расписания. Он показывает сумму часов, введенных для пользователя, на основе различных зарезервированных ролей, то есть стандартных рабочих часов, сверхурочных, праздников и офшоров.

Мне нужна одна строка для каждого [Name], но я получаю по строке для каждого SUM, где у пользователя есть данные.

Нужно ли мне создавать это как представление и SELECT для этого представления?

Мой текущий код ниже:


SELECT 
    TSDEPT_HEAD As [Resource],
    CONCAT (PP_FIRST_NAME,' ',PP_SURNAME) As [Name],    
    SUM(Case WHEN TST_ROLE = 'STD' Then TST_HOURS END) As STD, 
    SUM(Case WHEN TST_ROLE LIKE 'OT%' Then TST_HOURS END) As OT,
    SUM(Case WHEN TST_ROLE LIKE 'OFF%' Then TST_HOURS END) As OFFSHORE,
    SUM(Case WHEN TST_ROLE = 'HOL' Then TST_HOURS END) As HOL
    FROM TS_TIMESHEETS
LEFT JOIN SYS_PEOPLE on TST_RESOURCE = PP_CODE
LEFT JOIN TS_USERS on TST_RESOURCE = TSU_USERID
LEFT JOIN TS_DEPARTMENTS on TSU_DEPARTMENT_CODE = TSDEPT_CODE
WHERE MONTH(TST_DATE) = MONTH(GETDATE())
GROUP BY TSDEPT_NAME,TST_ROLE,PP_FIRST_NAME,PP_SURNAME,TST_RESOURCE,PP_KNOWN_AS,TSDEPT_HEAD
2
Saiyanthou 8 Фев 2021 в 14:24

2 ответа

Лучший ответ

Вы должны просто использовать group by для столбцов, которые вы действительно хотите агрегировать, обычно те же столбцы, которые у вас есть в select, но не с функциями агрегирования

SELECT 
TSDEPT_HEAD As [Resource],
CONCAT (PP_FIRST_NAME,' ',PP_SURNAME) As [Name],    
SUM(Case WHEN TST_ROLE = 'STD' Then TST_HOURS END) As STD, 
SUM(Case WHEN TST_ROLE LIKE 'OT%' Then TST_HOURS END) As OT,
SUM(Case WHEN TST_ROLE LIKE 'OFF%' Then TST_HOURS END) As OFFSHORE,
SUM(Case WHEN TST_ROLE = 'HOL' Then TST_HOURS END) As HOL
FROM TS_TIMESHEETS
LEFT JOIN SYS_PEOPLE on TST_RESOURCE = PP_CODE
LEFT JOIN TS_USERS on TST_RESOURCE = TSU_USERID
LEFT JOIN TS_DEPARTMENTS on TSU_DEPARTMENT_CODE = TSDEPT_CODE
WHERE MONTH(TST_DATE) = MONTH(GETDATE())
GROUP BY     TSDEPT_HEAD, CONCAT (PP_FIRST_NAME,' ',PP_SURNAME) 
3
scaisEdge 8 Фев 2021 в 11:40

Только GROUP BY [Name] - операторы суммы являются агрегатами, поэтому их не нужно включать в предложение группы. Это даст вам по одной строке для каждого человека на основе столбца [Имя].

1
Marshall 8 Фев 2021 в 11:38
66100685