将成对的关联列取消透视为行

Unpivot pairs of associated columns to rows

我有一个 table 商品价格交错,如下所示:

ArtNr   Amount1   Price1   Amount2   Price2   Amount3   Price3
--------------------------------------------------------------
4711          1      3.5         5      3.0        10      2.5
4712          1      5.0         3      4.5         5      4.0
4713          1      7.0        10      6.0       100      5.0

我想将其转换成这个结构:

ArtNr   Amount   Price
----------------------
4711         1     3.5
4711         5     3.0
4711        10     2.5
4712         1     5.0
4712         3     4.5
4712         5     4.0
...

这可以在 T-SQL 中使用 PIVOT/UNPIVOT 来完成,还是我必须使用 UNION?

CROSS APPLY (VALUES 通常是最简单的逆透视方法,尤其是多列时

SELECT
  t.ArtNr,
  v.Amount,
  v.Price
FROM YourTable t
CROSS APPLY (VALUES
  (Amount1, Price1),
  (Amount2, Price2),
  (Amount3, Price3)
) v(Amount, Price)

Some more tricks you can do with CROSS APPLY

您只能逆透视到 1 列,而不是 2 列。您可以通过将 Amount* 逆透视到 Amount 来做到这一点,但如果选中,Price1 - Price5 将保留在每一行中。因此,您可以将 Amount* 逆透视为 AtrNr、Amount,然后将其加入逆透视的 Price* 作为 ArtNr、Price。

但是,将其理解为 5 个简单的并集可能更容易理解。我怀疑两种方式的性能都没有那么不同,但这是您将自己测试和决定的东西。 (我自己没有测试过,因为我不知道数据量。)如果性能完全可以接受,我会选择 5 个并集,因为我相信这对于广大开发人员来说更容易阅读(unpivot is '那么常见),因此它在可维护性方面获得了很多分数。 YMMV.

请注意,当我发布我的帖子时没有看到 Charlieface 的回答,并且不知道 CROSS APPLY。这看起来是最佳答案,我投了赞成票。