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

如何用T-SQL的UNPIVOT实现商品阶梯价格关联列转行 替代UNION方案

问题解答

结论

你提到的需求完全可以通过T-SQL的UNPIVOT语法实现,不需要强制使用UNION语句,两种方式都能得到预期结果,另外也可以用更简洁的CROSS APPLY写法完成。以下是具体实现示例,示例中假设原表名为ProductTierPrice:

方案1:UNION ALL实现(逻辑最直观)

SELECT ArtNr, Amount1 AS Amount, Price1 AS Price FROM ProductTierPrice
UNION ALL
SELECT ArtNr, Amount2 AS Amount, Price2 AS Price FROM ProductTierPrice
UNION ALL
SELECT ArtNr, Amount3 AS Amount, Price3 AS Price FROM ProductTierPrice
ORDER BY ArtNr, Amount;

注意用UNION ALL而非UNION,不需要去重的场景下性能更高。

方案2:UNPIVOT实现(匹配你询问的语法要求)

因为需要同时转置Amount、Price两个配对列,需要对转置后的列做同组匹配:

SELECT ArtNr, Amount, Price
FROM (
    SELECT 
        ArtNr,
        Amount1, Price1,
        Amount2, Price2,
        Amount3, Price3
    FROM ProductTierPrice
) t
UNPIVOT (
    Amount FOR TierAmount IN (Amount1, Amount2, Amount3)
) upv_amount
UNPIVOT (
    Price FOR TierPrice IN (Price1, Price2, Price3)
) upv_price
-- 保证Amount和Price属于同一阶梯配对
WHERE RIGHT(TierAmount,1) = RIGHT(TierPrice,1)
ORDER BY ArtNr, Amount;

方案3:CROSS APPLY实现(T-SQL 2008及以上支持,更简洁高效)

如果不限制必须使用UNPIVOT语法,该写法比UNPIVOT更易维护:

SELECT p.ArtNr, v.Amount, v.Price
FROM ProductTierPrice p
CROSS APPLY (
    VALUES 
        (Amount1, Price1),
        (Amount2, Price2),
        (Amount3, Price3)
) v(Amount, Price)
ORDER BY p.ArtNr, v.Amount;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 23:57:00