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

