基于列1中的值的SQL转置

基于列1中的值的SQL转置,sql,sql-server-2008,Sql,Sql Server 2008,我有一个SQL查询,它给我一个2列的结果,如下所示: A | B ----- 2 | 1 3 | 2 3 | 3 3 | 4 3 | 5 4 | 6 4 | 7 4 | 8 4 | 9 我想把它分成这样的多个列。具有特定值的表中的每一行将其转换为列。如果有帮助的话,列a中某个特定值(比如x)可以出现的最大行数是4 A | B1 | B2 | B3 | B4 ---------------------------- 2 | 1 | NULL | NULL | NULL 3 |

我有一个SQL查询,它给我一个2列的结果,如下所示:

A | B
-----
2 | 1
3 | 2
3 | 3
3 | 4
3 | 5
4 | 6
4 | 7
4 | 8
4 | 9
我想把它分成这样的多个列。具有特定值的表中的每一行将其转换为列。如果有帮助的话,列a中某个特定值(比如x)可以出现的最大行数是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。

您可以使用行数和条件聚合:

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;

这对我有用。奇怪的是,在不知道列a中某个特定值可以出现的最大行数是4的情况下,这是可能的吗?@PyMan。如果您不知道最大数量,那么您需要使用更混乱的动态SQL。或者在您将SQL Server版本升级到受支持的版本后,使用字符串_agg-将值放入一列中。