SQL中使用日历表统计用户每日工时问题求助
解决方案:查询指定用户所有日期的工时总和(含无工时日期显示0)
这个需求完全可以实现,你的原SQL存在几个关键问题导致无法返回无工时的日期,下面是问题分析和修正后的方案:
原SQL的问题
- RIGHT JOIN后用HAVING过滤用户会丢失无工时日期:HAVING
[WorkData].User = 'User1'会过滤掉所有WorkData表中无匹配的行(也就是无工时的日期,此时WorkData.User为NULL),导致这部分日期无法显示。 - GROUP BY逻辑错误:你把
Duration也加入了GROUP BY,这会把同一天的不同Duration值拆分,而不是求和。 - 未处理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
相关产品推荐
相关产品推荐

