使用SQL PIVOT实现行转列遇语法错误,求解决方案
行转列(PIVOT)实现方案修正
你的代码出现语法错误的核心原因是PIVOT子句中直接使用数字作为列名不符合SQL规范,同时还有列名不匹配、聚合函数选择不当的问题。以下是修正后的完整方案:
错误原因总结
- PIVOT的
IN子句中,数字作为列标识符必须用方括号[]包裹,否则会触发语法错误。 - 外层查询的列名需要和PIVOT定义的列对应,并设置别名来得到
Store1这类格式的列名。 - 需求是汇总库存,应使用
SUM(stock)而非MAX(stock)来计算每个商品在对应门店的总库存。 - 原代码末尾多余的
stock关键字属于语法冗余,需删除。
修正后的代码
CREATE table #test222 ([Id] int,[ItemID] INT, [storeid] int, [stock] decimal(18,2) ); INSERT INTO #test222 ([Id],[ItemID], [storeid], [stock]) VALUES (1, 1, 3,10), (2, 1,1, 20), (3, 1,1, 30), (4, 2,1, 40), (5, 2,2,50), (6, 2,2,60), (7, 3,2,70), (8, 4,2,80), (9, 4,2,90), (10, 5,2,100); -- 查看原始数据 select * from #test222; -- 修正后的行转列查询 select ItemID, [1] AS Store1, [2] AS Store2, [3] AS Store3, [4] AS Store4, [5] AS Store5, [6] AS Store6, [7] AS Store7, [8] AS Store8, [9] AS Store9, [10] AS Store10 from ( -- 先按ItemID和StoreID汇总库存,确保每个组合只有一条总库存记录 SELECT ItemID, storeid, SUM(stock) AS stock FROM #test222 GROUP BY ItemID, storeid ) d pivot ( SUM(stock) for storeid in ([1],[2],[3],[4],[5],[6],[7],[8],[9],[10]) ) piv;
代码说明
- 子查询中先通过
GROUP BY ItemID, storeid和SUM(stock)完成库存汇总,避免PIVOT时出现聚合逻辑错误。 - PIVOT子句中用
[]包裹数字列名,符合SQL语法要求。 - 外层查询给每个数字列设置别名,得到
Store1至Store10的列名,完全匹配需求的输出结构。 - 最终结果会展示每个ItemID在不同门店的总库存,无库存的门店会显示
NULL。
内容的提问来源于stack exchange,提问作者Jony
相关产品推荐
相关产品推荐

