Я написал заявление 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 ответа
Вы должны просто использовать 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)
Только GROUP BY [Name]
- операторы суммы являются агрегатами, поэтому их не нужно включать в предложение группы. Это даст вам по одной строке для каждого человека на основе столбца [Имя].
Новые вопросы
sql
Язык структурированных запросов (SQL) - это язык запросов к базам данных. Вопросы должны включать примеры кода, структуру таблицы, примеры данных и тег для используемой реализации СУБД (например, MySQL, PostgreSQL, Oracle, MS SQL Server, IBM DB2 и т. Д.). Если ваш вопрос относится исключительно к конкретной СУБД (использует определенные расширения / функции), используйте вместо этого тег этой СУБД. Ответы на вопросы, помеченные SQL, должны использовать стандарт ISO / IEC SQL.