如何合并查询以统计每月产品新增与下架数量?
合并新增与下架产品月度统计的解决方案
这是个很常见的报表需求,核心思路是通过年月这个共同维度,把两个独立的统计结果关联起来,再结合你的日历表确保覆盖2018-2025的所有月份(避免出现无数据的月份被遗漏)。下面是具体的SQL实现:
WITH monthly_dates AS ( -- 从日历表提取所有唯一的年月,确保覆盖2018-2025全时段 SELECT DISTINCT YEAR(cal_date) AS Year, MONTH(cal_date) AS Month FROM qprod_calendar ), new_products AS ( -- 统计每月新增产品数量 SELECT YEAR(p.in_date) AS Year, MONTH(p.in_date) AS Month, COUNT(DISTINCT p.product_id) AS NewProd FROM products p WHERE p.in_date IS NOT NULL -- 过滤无入库日期的产品 GROUP BY YEAR(p.in_date), MONTH(p.in_date) ), discontinued_products AS ( -- 统计每月下架产品数量 SELECT YEAR(p.off_date) AS Year, MONTH(p.off_date) AS Month, COUNT(DISTINCT p.product_id) AS DiscontinuedProd FROM products p WHERE p.off_date IS NOT NULL -- 过滤无下架日期的产品 GROUP BY YEAR(p.off_date), MONTH(p.off_date) ) -- 合并两个统计结果,用COALESCE把NULL转为0(适配无数据的月份) SELECT md.Year, md.Month, COALESCE(np.NewProd, 0) AS NewProd, COALESCE(dp.DiscontinuedProd, 0) AS DiscontinuedProd FROM monthly_dates md LEFT JOIN new_products np ON md.Year = np.Year AND md.Month = np.Month LEFT JOIN discontinued_products dp ON md.Year = dp.Year AND md.Month = dp.Month ORDER BY md.Year, md.Month;
关键细节说明:
monthly_datesCTE:从你的日历表中提取唯一的年月组合,确保结果集中包含2018-2025的每一个月份,不会因为某个月无新增/下架产品而缺失。COUNT(DISTINCT p.product_id):如果存在同一产品多次入库/下架的情况(虽然业务上可能少见),用DISTINCT可以避免重复统计。COALESCE函数:把左连接后出现的NULL值转为0,这样图表中不会出现空白,数据展示更连贯。- 过滤NULL日期:在统计新增/下架时,过滤掉无对应日期的产品,避免无效数据干扰统计结果。
这个查询会返回如下格式的结果,完全满足你制作图表的需求:
| Year | Month | NewProd | DiscontinuedProd |
|---|---|---|---|
| 2018 | 1 | 5 | 3 |
| 2018 | 2 | 10 | 0 |
| 2018 | 3 | 2 | 7 |
内容的提问来源于stack exchange,提问作者BMa
相关产品推荐
相关产品推荐

