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

如何合并查询以统计每月产品新增与下架数量?

合并新增与下架产品月度统计的解决方案

这是个很常见的报表需求,核心思路是通过年月这个共同维度,把两个独立的统计结果关联起来,再结合你的日历表确保覆盖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_dates CTE:从你的日历表中提取唯一的年月组合,确保结果集中包含2018-2025的每一个月份,不会因为某个月无新增/下架产品而缺失。
  • COUNT(DISTINCT p.product_id):如果存在同一产品多次入库/下架的情况(虽然业务上可能少见),用DISTINCT可以避免重复统计。
  • COALESCE函数:把左连接后出现的NULL值转为0,这样图表中不会出现空白,数据展示更连贯。
  • 过滤NULL日期:在统计新增/下架时,过滤掉无对应日期的产品,避免无效数据干扰统计结果。

这个查询会返回如下格式的结果,完全满足你制作图表的需求:

YearMonthNewProdDiscontinuedProd
2018153
20182100
2018327

内容的提问来源于stack exchange,提问作者BMa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:15:37