SQL Server表转置报错:PIVOT语法错误,求正确实现方案
修正SQL Server PIVOT语法错误并实现表转置
你的PIVOT语句报错是因为SQL Server的PIVOT子句只能针对单一聚合列,不能同时指定多个MAX()函数。要实现你需要的转置效果,得先把原表的多指标列(Dollar_Volume、No_of_Sales、各价格区间)转换成行格式(用UNPIVOT),再对Item_Category进行PIVOT转成列。
错误原因分析
你原语句里的PIVOT部分写了多个聚合函数:
PIVOT ( MAX([$0 to $99]),MAX([$100 to $199]),MAX([$2000 to $2999]))
这不符合SQL Server的PIVOT语法规范,PIVOT要求只能有一个聚合操作和一个被聚合的列。
正确实现方案
我们需要分两步操作:
- UNPIVOT:把原表中每个需要转置的指标列(Dollar_Volume、No_of_Sales、$0-$99等)拆成
Attribute(指标名称)和Value(对应值)的行记录。 - PIVOT:将
Item_Category的值转成列,每个列对应不同Attribute的数值。
以下是完整的正确SQL代码:
SELECT [Year], Attribute, [Produce], [Clothing], [Fruits], [Vegetables], [Packed Food], [Detergent], [Entertainment] FROM ( -- 第一步:UNPIVOT,把多列指标转成行 SELECT [Year], Item_Category, Attribute, Value FROM RAVI_PROJECTS.dbo.YTD_Sales_Data UNPIVOT ( Value FOR Attribute IN ( Dollar_Volume, No_of_Sales, [$0-$99], [$100-$199], [$200-$299] ) ) AS Unpvt ) AS SourceData -- 第二步:PIVOT,把Item_Category转成列 PIVOT ( MAX(Value) -- 因为每个Year+Item_Category+Attribute组合只有一个值,MAX不影响结果 FOR Item_Category IN ( [Produce], [Clothing], [Fruits], [Vegetables], [Packed Food], [Detergent], [Entertainment] ) ) AS Pvt ORDER BY CASE Attribute -- 按你需要的顺序排序指标行 WHEN 'Dollar_Volume' THEN 1 WHEN 'No_of_Sales' THEN 2 WHEN '$0-$99' THEN 3 WHEN '$100-$199' THEN 4 WHEN '$200-$299' THEN 5 END;
代码说明
- UNPIVOT部分:把原表中每个指标列(比如Dollar_Volume)的数值,转换成一行
Attribute='Dollar_Volume'和对应Value的记录,这样所有指标都变成了行,方便后续PIVOT处理。 - PIVOT部分:以
Item_Category为列维度,用MAX(Value)聚合(因为每个组合唯一,MAX只是取唯一值),把每个类别转成单独的列。 - ORDER BY子句:确保输出的指标行顺序和你期望的一致(Dollar_Volume → No_of_Sales → 价格区间)。
执行这段代码后,就能得到你想要的转置结果了。
内容的提问来源于stack exchange,提问作者ravsun
相关产品推荐
相关产品推荐

