SQL查询优化求助:需显示全部用户含当日未录工时人员
解决SQL工时汇总显示所有符合条件用户的问题
没问题,我来帮你调整这个查询语句~你的核心需求是要显示所有满足Users.FeeEarner = 1且Users.UserStatus = 0的用户,哪怕他们当天没有录入工时,对应的数值字段显示NULL。原查询的问题在于用了INNER JOIN,它只会保留两边表都有匹配记录的用户,所以没工时的用户被过滤掉了。
修改步骤说明:
- 把
INNER JOIN改成LEFT JOIN:这样会保留左表(Users)中所有符合条件的用户,即使右表(TimeTransactions)没有对应的工时记录 - 将
TimeTransactions的日期筛选条件从WHERE子句移到JOIN的ON子句中:如果放在WHERE里,会把没有工时记录的用户(此时TransactionDate为NULL)再次过滤掉,破坏LEFT JOIN的效果 - 把
SUM(CASE...)里的ELSE 0改成ELSE NULL:这样没有工时记录时,汇总结果就会显示NULL,而不是默认的0
修改后的完整查询语句:
SELECT SUM(CASE WHEN TimeTransactions.ChargeBasis = 'C' THEN TimeTransactions.QuantityOfTime/60/6 ELSE NULL END) AS ChargableUnits, SUM(CASE WHEN TimeTransactions.ChargeBasis = 'N' THEN TimeTransactions.QuantityOfTime/60/6 ELSE NULL END) AS NonChargableUnits, SUM(CASE WHEN TimeTransactions.ChargeBasis = 'C' THEN TimeTransactions.ValueOfTime ELSE NULL END) AS ChargableValue, SUM(CASE WHEN TimeTransactions.ChargeBasis = 'N' THEN TimeTransactions.ValueOfTime ELSE NULL END) AS NonChargableValue, SUM(TimeTransactions.QuantityOfTime)/60/6 AS TotalUnits, SUM(TimeTransactions.ValueOfTime) AS TotalValue, Users.Code AS FeeEarner FROM Users LEFT JOIN TimeTransactions ON TimeTransactions.FeeEarnerRef = Users.Code AND TimeTransactions.TransactionDate >= dateadd(day,datediff(day,1,GETDATE()),0) AND TimeTransactions.TransactionDate < dateadd(day,datediff(day,0,GETDATE()),0) WHERE Users.FeeEarner = 1 AND Users.UserStatus = 0 GROUP BY Users.Code
额外说明:
- 对于
TotalUnits和TotalValue,因为SUM(NULL)的结果就是NULL,所以不需要额外加CASE判断,没有工时记录时自然会显示NULL - 如果后续需要把
NULL显示成0,可以在SUM外面套个ISNULL()函数,比如ISNULL(SUM(...), 0),不过按照你的需求现在保持NULL就好
内容的提问来源于stack exchange,提问作者GSJLawrence
相关产品推荐
相关产品推荐

