SQL 根据第 1 列中的值进行转置

SQL transpose based on values in col 1

我有一个 SQL 查询,它给我一个像这样的 2 列结果:

A | B
-----
2 | 1
3 | 2
3 | 3
3 | 4
3 | 5
4 | 6
4 | 7
4 | 8
4 | 9

我想像这样把它分成多列。 A 中具有特定值的每一行都将其转换为列。特定值的最大行数说 x 可以出现在列 A 中是 4(如果有帮助的话)。

A | B1   | B2   | B3  |  B4 
----------------------------
2 | 1    | NULL | NULL | NULL
3 | 2    | 3    | 4    | 5
4 | 6    | 7    | 8    | 9

几个小时以来,我一直在尝试使用 pivot 来执行此操作。我现在正在考虑在 python(使用它的客户端)中查询它并在那里进行转换(这很容易)。但这可以在 SQL 中完成吗?我正在使用 SQL Server 2016。

您可以使用 row_number() 和条件聚合:

select a,
       max(case when seqnum = 1 then b end) as b_1,
       max(case when seqnum = 2 then b end) as b_2,
       max(case when seqnum = 3 then b end) as b_3,
       max(case when seqnum = 4 then b end) as b_4
from (select t.*, row_number() over (partition by a order by b) as seqnum
      from t
     ) t
group by a;