我想在一列上的列基础中选择一些行。
我有这些数据:
PersonID PersonDep PersonBranch RoleName RoleDep RoleBranch IsPriority RoleLevel
----------------------------------------------------------------------------------------
1 x1 y1 Manager x2 y2 1 Role1
1 x1 y1 User x3 y3 0 Role2
2 x4 y4 Admin x2 y2 0 Role1
2 x4 y4 User x6 y6 0 Role2
2 x4 y4 Manager x7 y7 0 Role3
3 b1 d1 NULL NULL NULL NULL NULL
我想要这个结果:
PersonID PersonDep PersonBranch Role1 RoleName RoleDep RoleBranch Role2 RoleName RoleDep RoleBranch Role3 RoleName RoleDep RoleBranch
--------------------------------------------------------------------------------------------------------------------------------------
1 x1 y1 Role1 Manager(priorit) x2 y2 Role2 User x3 y3 NULL NULL NULL NULL
2 x4 y4 Role1 Admin x2 y2 Role2 User x6 y6 Role3 Manager x7 y7
3 b1 d1 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL
任何团体都可以使用未知的RoleLevel
Count来解决这个问题吗?
答案 0 :(得分:4)
将CASE .. WHEN
与聚合函数
; with
cte as
(
select *, rn = row_number() over (partition by PersonID order by RoleName)
from yourtable
)
select PersonID, PersonDep PersonBranch,
RoleName1 = max(case when rn = 1 then RoleName end),
RoleDep1 = max(case when rn = 1 then RoleDep end),
RoleBranch1 = max(case when rn = 1 then RoleBranch end),
RoleName2 = max(case when rn = 2 then RoleName end),
. . .
from cte
group by PersonID, PersonDep PersonBranch
答案 1 :(得分:0)
除非您使用动态SQL,否则无法在未知数量的列上进行数据透视。
使用动态SQL,您需要循环遍历行并使用所有列构建SQL命令。
如果您可以指定RoleLevel
的上限,则可以使用标准PIVOT
来调整多个列