按日期范围关联两张表并分组统计的SQL查询问题求助
修正后的SQL查询及问题解析
问题根源
你的查询出现NULL值的核心原因:
- 关联方向错误:使用
LEFT JOIN以工时表(Table1)为主,导致当预算表(Table2)中2022年的记录没有匹配工时数据时,会丢失Table2的Client等信息;反之如果Table2有记录但Table1无对应工时,也会因为取t1.client而得到NULL。 - 字段名不匹配:你引用的
t2.from_date、t2.to_date、t2.budget和Table2实际字段名(Start Range、End Range、Time Budget)不符。 - 聚合分组逻辑未对齐:分组字段来源不统一,导致统计异常。
修正后的SQL
SELECT t2.`Task` AS task, t2.`Time Budget` AS budget, t2.`Client` AS client, t2.`Start Range` AS start_range, t2.`End Range` AS end_range, COALESCE(SUM(t1.`Hours`), 0) AS time_spent FROM `Table2` t2 LEFT JOIN `Table1` t1 ON t1.`Task` = t2.`Task` AND t1.`Client` = t2.`Client` AND DATE(t1.`Time`) BETWEEN t2.`Start Range` AND t2.`End Range` GROUP BY t2.`Task`, t2.`Time Budget`, t2.`Client`, t2.`Start Range`, t2.`End Range`
关键修改说明
- 调整关联方向:以预算表Table2作为左表,确保所有预算记录都被保留,即使没有对应工时数据。
- 修正字段引用:使用Table2的实际字段名(带空格的字段需用反引号包裹),避免因字段名错误导致的匹配失败。
- 替换Client来源:从
t1.client改为t2.client,确保即使没有工时数据,Client信息也不会为NULL。 - 添加COALESCE函数:将NULL的工时统计转为0,结果更符合业务逻辑。
- 规范分组字段:分组字段明确引用Table2的字段,确保分组逻辑和SELECT字段完全对齐(部分SQL方言要求所有非聚合字段必须出现在GROUP BY中)。
额外注意事项
- 确认
DATE(t1.Time)和t2.Start Range/t2.End Range的日期类型一致(例如都是DATE或DATETIME),避免日期格式不匹配导致的关联失败。 - 如果需要按年度筛选,可以在查询末尾添加
WHERE YEAR(t2.Start Range) = 2022(或根据日期范围判断年度)来针对性统计某一年的数据。
内容的提问来源于stack exchange,提问作者DrZoidberg09
相关产品推荐
相关产品推荐

