繁体   English   中英

SQL Server条件交叉表

[英]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;

参见带有演示的SQL Fiddle

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM