没有聚合的不均匀枢轴(填充空白)

时间:2017-05-19 23:57:24

标签: sql sql-server tsql

我有下表

标题:用户,状态,值

row1:u1,A,3

第2行:u1,B,5

第3行:u1,B,2

row4,u2,A,4

第5行:u2,C,8

如果从一个用户到另一个用户的值不足,我希望输出为带有NULL的交叉表。在示例中,输出将是:

标题:状态,u1,u2

第1行:A,3,4

row2:B,5,NULL

row3:B,2,NULL

row4:C,NULL,8

(我正在使用SQL Server 2016.)

1 个答案:

答案 0 :(得分:0)

不清楚您是否需要动态(即用户列)。如果需要,可以处理小事。

示例

Select [Status]       
      ,u1 = max(case when [user]='u1' then Value end)
      ,u2 = max(case when [user]='u2' then Value end)
 From ( 
        Select *
              ,Grp = Value - Row_Number() over (Partition By [Status] Order by Value)
         From  YourTable
      ) A
 Group By [Status],[Grp]
 Order By 1,2,3

<强>返回

Status  u1      u2
A       3       4
B       2       NULL
B       5       NULL
C       NULL    8
  

编辑 - 动态方法

Declare @SQL varchar(max) = Stuff((Select Distinct ',' + QuoteName([User]) From Yourtable  Order by 1 For XML Path('')),1,1,'') 
Select  @SQL = '
Select [Status],' + @SQL + '
From (
        Select *
              ,Grp = Value - Row_Number() over (Partition By [Status] Order by Value)
         From  YourTable
     ) A
 Pivot (max([Value]) For [User] in (' + @SQL + ') ) p
 Order By 1,2,3
 '
Exec(@SQL);