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,您会发现许多示例