将成对的关联列取消透视为行
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。这看起来是最佳答案,我投了赞成票。
我有一个 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。这看起来是最佳答案,我投了赞成票。