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;
我有一个 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;