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

SQL中使用日历表统计用户每日工时问题求助

解决方案:查询指定用户所有日期的工时总和(含无工时日期显示0)

这个需求完全可以实现,你的原SQL存在几个关键问题导致无法返回无工时的日期,下面是问题分析和修正后的方案:

原SQL的问题

  1. RIGHT JOIN后用HAVING过滤用户会丢失无工时日期:HAVING [WorkData].User = 'User1'会过滤掉所有WorkData表中无匹配的行(也就是无工时的日期,此时WorkData.User为NULL),导致这部分日期无法显示。
  2. GROUP BY逻辑错误:你把Duration也加入了GROUP BY,这会把同一天的不同Duration值拆分,而不是求和。
  3. 未处理NULL值:无工时的日期对应的Duration是NULL,需要转换为0才能显示预期结果。

修正后的SQL语句

SELECT 
    'User1' AS [User],
    Calendar.Dates,
    Nz(SUM(WorkData.Duration), 0) AS TotalDuration
FROM 
    Calendar
LEFT JOIN 
    WorkData ON Calendar.Dates = WorkData.[Start Date] 
             AND WorkData.User = 'User1'
GROUP BY 
    Calendar.Dates
ORDER BY 
    Calendar.Dates;

关键说明

  • LEFT JOIN+用户过滤在JOIN条件:以Calendar为主表,LEFT JOIN时直接限定WorkData的用户为'User1',这样所有Calendar的日期都会被保留,无工时的日期只会关联到WorkData的NULL值。
  • Nz函数处理NULL:Nz(SUM(WorkData.Duration), 0)会把SUM结果为NULL的情况(无工时)转换成0,符合需求。
  • 固定用户字段:因为查询的是指定用户,直接在SELECT里写死'User1'即可,避免NULL值。

VBA中使用注意事项

  • 确保你的ADO连接字符串正确指向Excel文件,示例连接字符串:
Dim conn As Object
Set conn = CreateObject("ADODB.Connection")
conn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\YourFile.xlsx;Extended Properties=""Excel 12.0 Xml;HDR=YES"";"
  • 执行查询时可以用ADODB.Recordset获取结果,再写入Excel工作表。

内容的提问来源于stack exchange,提问作者sequelle

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 22:55:17