如何用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
相关产品推荐
相关产品推荐

