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

使用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;

代码说明

  1. 子查询中先通过GROUP BY ItemID, storeid和SUM(stock)完成库存汇总,避免PIVOT时出现聚合逻辑错误。
  2. PIVOT子句中用[]包裹数字列名,符合SQL语法要求。
  3. 外层查询给每个数字列设置别名,得到Store1至Store10的列名,完全匹配需求的输出结构。
  4. 最终结果会展示每个ItemID在不同门店的总库存,无库存的门店会显示NULL。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 11:10:41