You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何合并两个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 01:25:14