如何合并两个SQL查询以获取月度销售统计三列数据?
解决方案
方法1:条件聚合(推荐,更高效)
直接在单查询里通过条件判断区分统计,一次就能得到你要的三列数据,不用折腾合并两个查询。
假设你的销售表叫sales,产品分类字段是category,销售日期是sale_date,销售记录ID是id,示例SQL如下:
SELECT DATE_FORMAT(sale_date, '%Y-%m') AS Month, COUNT(id) AS total_sold_products, COUNT(CASE WHEN category = '饮品' THEN id END) AS drinks_sold_products FROM sales WHERE YEAR(sale_date) = 2022 GROUP BY DATE_FORMAT(sale_date, '%Y-%m') ORDER BY Month;
DATE_FORMAT(sale_date, '%Y-%m')用来提取「年份-月份」格式的标识,保证各月分组准确COUNT(id)直接统计所有售出产品的总数COUNT(CASE WHEN category = '饮品' THEN id END)只统计分类为饮品的记录,不满足条件的会返回NULL,而COUNT会自动忽略NULL,刚好得到饮品的销量
方法2:子查询关联(适合两个查询逻辑差异大的情况)
如果两个统计逻辑太复杂没法合并成一个查询,就分别算出总销量和饮品销量,再通过月份字段关联起来:
SELECT t1.Month, t1.total_sold_products, COALESCE(t2.drinks_sold_products, 0) AS drinks_sold_products FROM (SELECT DATE_FORMAT(sale_date, '%Y-%m') AS Month, COUNT(id) AS total_sold_products FROM sales WHERE YEAR(sale_date) = 2022 GROUP BY DATE_FORMAT(sale_date, '%Y-%m')) t1 LEFT JOIN (SELECT DATE_FORMAT(sale_date, '%Y-%m') AS Month, COUNT(id) AS drinks_sold_products FROM sales WHERE YEAR(sale_date) = 2022 AND category = '饮品' GROUP BY DATE_FORMAT(sale_date, '%Y-%m')) t2 ON t1.Month = t2.Month ORDER BY t1.Month;
- 子查询
t1统计2022年各月总销量,t2统计同期饮品销量 - 用
LEFT JOIN关联,确保哪怕某个月没有饮品销量,也能显示该月的总销量 COALESCE(..., 0)把没有饮品销量月份的空值换成0,避免结果里出现空白
为啥Union不行?
UNION是用来把两个结果集的行拼在一起,要求两个结果集的列数、类型完全一致。你之前的两个查询都是返回「月份+计数」,用UNION后只会得到两列,还会出现重复的月份行,比如同一个月的总销量和饮品销量各占一行,自然会出现重复统计、列数不对的问题。
内容的提问来源于stack exchange,提问作者Karam Abu Shammala
相关产品推荐
相关产品推荐

