如何用单条SQL按worker与type分组,关联两表计算汇总值?
问题背景
表结构
table1
date - type 22/05/23 - 1 22/05/23 - 1 22/05/23 - 2 22/05/24 - 1 22/05/25 - 2
table2
date - worker 22/05/23 - 20 22/05/24 - 23 22/05/25 - 17
原有实现方式
- 统计table1中每个date和type的记录数:
SELECT date, type, COUNT(*) FROM table1 GROUP BY date, type;
得到结果:
date - type - count 22/05/23 - 1 - 2 22/05/23 - 2 - 1 22/05/24 - 1 - 1 22/05/25 - 2 - 1
- 通过PHP循环,对每个日期执行SQL获取对应worker:
SELECT worker FROM table2 WHERE date = $date
- 最终合并得到目标结果:
date - type - count - worker 22/05/23 - 1 - 2 - 20 22/05/23 - 2 - 1 - 20 22/05/24 - 1 - 1 - 23 22/05/25 - 2 - 1 - 17
现需用单条SQL实现上述结果,并按worker和type分组计算汇总值用于薪酬计算。
正确SQL写法
1. 单条SQL获取合并后的基础结果
通过INNER JOIN关联两个表(若需保留table1中无对应worker的日期,改用LEFT JOIN),直接得到合并结果:
SELECT t1.date, t1.type, COUNT(*) AS count, t2.worker FROM table1 t1 INNER JOIN table2 t2 ON t1.date = t2.date GROUP BY t1.date, t1.type, t2.worker;
这条SQL的输出和你之前分步操作的最终结果完全一致。
2. 按worker和type分组计算汇总值
如果需要统计每个worker处理每种type的总记录数,可直接基于关联后的表分组聚合:
SELECT t2.worker, t1.type, COUNT(*) AS total_count FROM table1 t1 INNER JOIN table2 t2 ON t1.date = t2.date GROUP BY t2.worker, t1.type;
也可以通过子查询先按日期和type统计,再关联表2汇总:
SELECT t2.worker, t1.type, SUM(count_per_date_type) AS total_count FROM ( SELECT date, type, COUNT(*) AS count_per_date_type FROM table1 GROUP BY date, type ) t1 INNER JOIN table2 t2 ON t1.date = t2.date GROUP BY t2.worker, t1.type;
错误说明
你之前尝试的SQL存在语法错误:SUM函数内嵌套多表查询的写法不符合SQL规范,正确做法是通过JOIN关联两张表后,再根据需求分组聚合。
内容的提问来源于stack exchange,提问作者Rafael
相关产品推荐
相关产品推荐

