如何使用相关列来旋转基本一列?

时间:2018-05-03 07:45:59

标签: sql sql-server pivot

我想在一列上的列基础中选择一些行。

我有这些数据:

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来解决这个问题吗?

2 个答案:

答案 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来调整多个列