Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server条件交叉表_Sql_Sql Server 2008_Tsql_Pivot - Fatal编程技术网

SQL Server条件交叉表

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 --------- -------------- -------------- -------------- ----

使用MS-SQL,我正在寻找构造条件交叉表查询的最佳方法,我想这是描述它的最佳方法

简化一下,我有一个客户端数据集(每个客户端都有一个唯一的ID)。每个客户都被分配到一个团队。大多数客户机只分配给一个团队,但有些客户机可以分配给2个、3个或最多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;