Sql 如何将一个柱与相关柱进行轴心旋转?

Sql 如何将一个柱与相关柱进行轴心旋转?,sql,sql-server,pivot,Sql,Sql Server,Pivot,我想在一列的基础上选择一些列 我有以下数据: PersonID PersonDep PersonBranch RoleName RoleDep RoleBranch IsPriority RoleLevel ---------------------------------------------------------------------------------------- 1 x1 y1 Manager x2

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

我有以下数据:

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?

使用
CASE.来解决这个问题。。当
具有聚合功能时

; 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

不能,除非使用动态SQL,否则无法以未知数量的列为轴心

使用动态SQL,您需要通过行循环,并使用所有列构建SQL命令


如果您可以为
RoleLevel
指定一个上限,则可以使用标准
PIVOT
和一些技巧来透视多个列

规则/条件是什么?你能解释一下如何从你的数据中得到结果吗?每个
PersonID
都有一定的作用。我想用角色为每个
PersonID
显示一行unnormalized@alfin-e-r否-完全正常化如果角色是动态的-如何编写此代码?您的意思是您没有未知的每人角色数?在这种情况下,您需要使用
动态SQL
确定-您可以编写此代码吗?如果您查看google或stackoverflow,您会发现许多示例