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

如何用SQL无需指定月份参数,从单列按月份统计商品销量

按月份统计销量并转为列展示

要实现不指定固定月份、将各月销量转为列的需求,核心是用条件聚合或数据库自带的行转列功能,以下分场景给出方案:

通用CASE WHEN写法(适配MySQL、Oracle、SQL Server等多数数据库)

通过CASE WHEN对每个月份的销量做条件求和,直接生成对应列:

SELECT 
    IH_ITEMNO AS ITEMNO,
    -- 2022年7月销量
    SUM(CASE WHEN DATE_FORMAT(IH_DATE, '%Y-%m') = '2022-07' THEN IH_QTY ELSE 0 END) AS July,
    -- 2022年8月销量
    SUM(CASE WHEN DATE_FORMAT(IH_DATE, '%Y-%m') = '2022-08' THEN IH_QTY ELSE 0 END) AS Aug,
    -- 2022年9月销量
    SUM(CASE WHEN DATE_FORMAT(IH_DATE, '%Y-%m') = '2022-09' THEN IH_QTY ELSE 0 END) AS Sep,
    -- 2022年10月销量
    SUM(CASE WHEN DATE_FORMAT(IH_DATE, '%Y-%m') = '2022-10' THEN IH_QTY ELSE 0 END) AS Oct,
    -- 可继续添加其他月份的统计语句
    SUM(CASE WHEN DATE_FORMAT(IH_DATE, '%Y-%m') = '2022-12' THEN IH_QTY ELSE 0 END) AS Dec
FROM tbl_item_history
WHERE IH_ITEMNO LIKE '%PG' AND IH_TYPE = 'S'
GROUP BY IH_ITEMNO
ORDER BY IH_ITEMNO ASC;

注意:日期格式化函数需根据数据库调整:

  • SQL Server 用 CONVERT(VARCHAR(7), IH_DATE, 120) 或 FORMAT(IH_DATE, 'yyyy-MM')
  • Oracle 用 TO_CHAR(IH_DATE, 'YYYY-MM')

SQL Server专属PIVOT写法

利用SQL Server的PIVOT语法实现行转列,代码更简洁:

SELECT 
    IH_ITEMNO AS ITEMNO,
    [2022-07] AS July,
    [2022-08] AS Aug,
    [2022-09] AS Sep,
    [2022-10] AS Oct,
    [2022-12] AS Dec
FROM (
    -- 子查询先提取商品编号、年月、销量
    SELECT 
        IH_ITEMNO,
        CONVERT(VARCHAR(7), IH_DATE, 120) AS MonthYear,
        IH_QTY
    FROM tbl_item_history
    WHERE IH_ITEMNO LIKE '%PG' AND IH_TYPE = 'S'
) AS SourceTable
-- 对年月进行行转列,求和销量
PIVOT (
    SUM(IH_QTY)
    FOR MonthYear IN ([2022-07], [2022-08], [2022-09], [2022-10], [2022-12])
) AS PivotTable
ORDER BY ITEMNO ASC;

拓展说明

如果需要自动适配表中所有存在的月份(无需手动写每个月份的语句),静态SQL无法实现,需用动态SQL生成列列表。比如MySQL中可以通过拼接SQL字符串执行,SQL Server中可以用动态语句生成PIVOT的IN子句。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 18:40:31