我有下表
row1:u1,A,3
第2行:u1,B,5
第3行:u1,B,2
row4,u2,A,4
第5行:u2,C,8
如果从一个用户到另一个用户的值不足,我希望输出为带有NULL的交叉表。在示例中,输出将是:
第1行:A,3,4
row2:B,5,NULL
row3:B,2,NULL
row4:C,NULL,8
(我正在使用SQL Server 2016.)
答案 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);