You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:28:35