[英]SQL Server conditional crosstab
我正在使用MS-SQL寻找构造条件交叉表查询的最佳方法,我猜这是描述它的最佳方法。
在这里简化一下,我有一个CLIENTS数据集(每个都有唯一的ID)。 这些客户端中的每一个都分配给一个TEAM。 大多数客户只分配给1个团队,但是有些客户可以分配给2、3或最多5个团队。 我希望查询结果如下所示:
Client_ID Assigned_Team1 Assigned_Team2 Assigned_Team3 Assigned_Team4 Assigned_Team5
--------- -------------- -------------- -------------- -------------- --------------
87496 Red Team Null Null Null Null
74559 Red Team Blue Team White Team Null Null
56345 Blue Team Green Team Null Null Null
21473 Yellow Team Blue Team White Team Red Team Green Team
为了获得结果,您将需要使用row_number()
。 row_number将用于为client_id
每个团队分配顺序值。 然后使用该序列号将结果转换为列。 您可以通过几种方法将数据行转换为列。 (注意:我在猜测表的结构)
您可以将聚合函数与CASE表达式一起使用:
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;
请参阅带有演示的SQL Fiddle 。
或者,您可以使用PIVOT功能:
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;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.