Sql 选择中的多个总和,但在一个视图中

Sql 选择中的多个总和,但在一个视图中,sql,sql-server,Sql,Sql Server,我已经写了一个select语句来协助时间表审批。它显示的是根据预订的不同角色,即标准办公时间、加班、假期和离岸时间,针对用户输入的小时数总和 我希望每个[Name]都有一行,但对于用户有数据的每个总和,我都有一行 我是否需要将此创建为视图并选择该视图 我目前的代码如下: SELECT TSDEPT_HEAD As [Resource], CONCAT (PP_FIRST_NAME,' ',PP_SURNAME) As [Name], SUM(Case WHEN

我已经写了一个select语句来协助时间表审批。它显示的是根据预订的不同角色,即标准办公时间、加班、假期和离岸时间,针对用户输入的小时数总和

我希望每个[Name]都有一行,但对于用户有数据的每个总和,我都有一行

我是否需要将此创建为视图并选择该视图

我目前的代码如下:


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

对于真正需要聚合的列,应该只使用group by,与select中的列相同,但不使用aggreagtion函数

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) 

仅按[Name]分组-sum语句是聚合语句,因此不需要包含在GROUP子句中。这将根据[Name]列为每个人提供一行。

按组分组根据其名称,按其后面的表达式对行进行分组。为什么要对不在选择中的列进行分组?另外,不要使用诸如WHERE monthst_DATE=MONTHGETDATE这样的语法;这不是萨尔盖布。相反,使用>=使用包含日期逻辑,您需要修改分组依据和仅按所需列进行分组,在本例中,按TSDEPT_NAME、PP_FIRST_NAME、PP_姓氏进行分组您是否意识到仅基于月份的筛选将合并来自不同年份但相同月份的行?只有当您的测试数据变化足以验证您的逻辑时,您的查询才能正常工作。@Smor。我在where子句中添加了YearTST_DATE=YearGETDATE。这只在一月份才上线,但是的,12个月后会很有趣。@Larnu谢谢。。答案已更新。。向上投票,谢谢。分组太多了@赛扬古。如果我的答案是正确的,请在15分钟后引导您找到正确的解决方案,将其标记为已接受…查看此处的操作方法