SQL Server条件交叉表
使用MS-SQL,我正在寻找构造条件交叉表查询的最佳方法,我想这是描述它的最佳方法 简化一下,我有一个客户端数据集(每个客户端都有一个唯一的ID)。每个客户都被分配到一个团队。大多数客户机只分配给一个团队,但有些客户机可以分配给2个、3个或最多5个团队。我希望我的查询结果如下所示:SQL Server条件交叉表,sql,sql-server-2008,tsql,pivot,Sql,Sql Server 2008,Tsql,Pivot,使用MS-SQL,我正在寻找构造条件交叉表查询的最佳方法,我想这是描述它的最佳方法 简化一下,我有一个客户端数据集(每个客户端都有一个唯一的ID)。每个客户都被分配到一个团队。大多数客户机只分配给一个团队,但有些客户机可以分配给2个、3个或最多5个团队。我希望我的查询结果如下所示: 客户ID已分配\u团队1已分配\u团队2已分配\u团队3已分配\u团队4已分配\u团队5 --------- -------------- -------------- -------------- ----
客户ID已分配\u团队1已分配\u团队2已分配\u团队3已分配\u团队4已分配\u团队5
--------- -------------- -------------- -------------- -------------- --------------
87496红队无效无效
74559红队蓝队白队空
56345蓝色团队绿色团队Null Null
21473黄队蓝队白队红队绿队
为了获得结果,您需要使用行编号()。行号将用于为客户id
的每个团队分配顺序值。然后使用该序列号将结果转换为列。有几种方法可以将数据行转换为列。(注:我在猜测表结构)
可以将聚合函数与大小写表达式一起使用:
select client_id,
max(case when seq = 1 then team end) Assigned_Team1,
max(case when seq = 2 then team end) Assigned_Team2,
max(case when seq = 3 then team end) Assigned_Team3,
max(case when seq = 4 then team end) Assigned_Team4,
max(case when seq = 5 then team end) Assigned_Team5
from
(
select client_id, team,
row_number() over(partition by client_id order by team) seq
from clients
) d
group by client_id;
看
也可以使用枢轴功能:
select client_id,
[1] Assigned_Team1,
[2] Assigned_Team2,
[3] Assigned_Team3,
[4] Assigned_Team4,
[5] Assigned_Team5
from
(
select client_id, team,
row_number() over(partition by client_id order by team) seq
from clients
) d
pivot
(
max(team)
for seq in ([1], [2], [3], [4], [5])
) piv;
看