如何用SQL对比两张按日期分组求和的同结构表,缺失日期补0?
实现两张分组后表的日期维度金额对比汇总
现有分组查询结果
表A
执行分组求和SQL:
SELECT SUM(amount) AS amount, DATE_FORMAT(date,'%m %y') AS date FROM `TableA` GROUP BY DATE_FORMAT(date,'%m%y');
得到结果:
| amount | date |
|---|---|
| 11 | 05 22 |
| 22 | 06 22 |
| 33 | 07 22 |
| 44 | 08 22 |
| 55 | 09 22 |
| 66 | 10 22 |
表B
执行分组求和SQL:
SELECT SUM(amount) AS amount, DATE_FORMAT(date,'%m %y') AS date FROM `TableB` GROUP BY DATE_FORMAT(date,'%m%y');
得到结果:
| amount | date |
|---|---|
| 77 | 07 22 |
| 88 | 08 22 |
| 99 | 09 22 |
| 111 | 10 22 |
| 222 | 11 22 |
生成对比汇总表的SQL方案
通过获取所有唯一日期,再左连接两张表的分组结果,用COALESCE将缺失值补0,最终按日期排序:
WITH all_dates AS ( SELECT date FROM ( SELECT DATE_FORMAT(date,'%m %y') AS date FROM TableA UNION SELECT DATE_FORMAT(date,'%m %y') AS date FROM TableB ) AS dates ) SELECT COALESCE(a.amount, 0) AS `amount(Table A)`, COALESCE(b.amount, 0) AS `amount(Table B)`, ad.date AS `date` FROM all_dates ad LEFT JOIN ( SELECT SUM(amount) AS amount, DATE_FORMAT(date,'%m %y') AS date FROM TableA GROUP BY DATE_FORMAT(date,'%m%y') ) a ON ad.date = a.date LEFT JOIN ( SELECT SUM(amount) AS amount, DATE_FORMAT(date,'%m %y') AS date FROM TableB GROUP BY DATE_FORMAT(date,'%m%y') ) b ON ad.date = b.date ORDER BY STR_TO_DATE(ad.date, '%m %y');
最终输出结果
| amount(Table A) | amount(Table B) | date |
|---|---|---|
| 11 | 0 | 05 22 |
| 22 | 0 | 06 22 |
| 33 | 77 | 07 22 |
| 44 | 88 | 08 22 |
| 55 | 99 | 09 22 |
| 66 | 111 | 10 22 |
| 0 | 222 | 11 22 |
内容的提问来源于stack exchange,提问作者Kyaw Wint Thu
相关产品推荐
相关产品推荐

