Sql server 将行切换为列
我有一个表格项目ctc grp usr:Sql server 将行切换为列,sql-server,pivot,Sql Server,Pivot,我有一个表格项目ctc grp usr: USER_ID PROJ_ID CTC_GRP_ID 2 1 1 2 1 2 3 1 1 3 1 2 4 2 2 表**ctc\U grp:** CTC_GRP_ID CTC_GRP_DS 1 Bank Contact 2 Dept2 表*用户* 我正在使用以下查询:
USER_ID PROJ_ID CTC_GRP_ID
2 1 1
2 1 2
3 1 1
3 1 2
4 2 2
表**ctc\U grp:**
CTC_GRP_ID CTC_GRP_DS
1 Bank Contact
2 Dept2
表*用户*
我正在使用以下查询:
SELECT *
FROM ( SELECT PROJ.PROJ_ID,
CTC_GRP_DS
FROM dbo.Project PROJ
left join dbo.PROJ_CTC_GRP_USER PCGU on PROJ.PROJ_ID = PCGU.PROJ_ID
left join dbo.CTC_GRP CG on PCGU.CTC_GRP_ID = CG.CTC_GRP_ID
) data
PIVOT
( MAX(CTC_GRP_DS)
FOR CTC_GRP_DS IN ([Bank Contact],[Dept2])
) pvt4
并且低于输出
PROJ_ID Bank Contact Dept2
1 Bank Contact Dept2
2 NULL Dept2
我正在尝试以下面的形式显示它
PROJ_ID Bank Contact Dept2
1 saravanakumarRajkumar, soosaiAntony saravanakumarRajkumar, soosaiAntony
2 NULL AllenAdam...
我试过了,结果没有运气……请帮忙吧……你们很接近了。但是,您在枢轴中的聚合函数应该是您在完成枢轴后想要的值。因此,由于在聚合和FOR中都使用了CTC_GRP_DS,因此最终将数据透视列名作为值。希望您可以使用下面的查询。注意:查询中的项目表没有显示,因此可能需要包含该表
SELECT * FROM
(
SELECT
p.[PROJ_ID]
,c.CTC_GRP_DS
,u.USER_FIRST_NM + ', ' + u.USER_LST_NM as UserName
FROM [proj_ctc_grp_usr] p
LEFT JOIN
ctc_grp c
ON
p.CTC_GRP_ID = c.CTC_GRP_ID
LEFT JOIN
[User] u
ON
p.[User_ID] = u.[User_ID]
) d
PIVOT(
MAX(UserName)
FOR CTC_GRP_DS IN ([Bank Contact], Dept2)
)p
你需要做一些事情才能得到结果 首先,当前使用PIVOT的查询不正确。您正试图获取数据中每个
CTC\u GRP\u DS
的MAX(CTC\u GRP\u DS)
。实际上,您希望返回数据中每个CTC\u GRP\u DS
的名称
其次,您需要将名字和姓氏连接在一起,还需要连接每个项目的名称列表。您可以使用XML路径的
来进行连接
;with cte as
(
SELECT PCGU.PROJ_ID,
name = u.USER_LST_NM + ', '+ u.USER_FIRST_NM,
CTC_GRP_DS
FROM dbo.[user] u
left join dbo.proj_ctc_grp_usr PCGU
on u.USER_ID = PCGU.USER_ID
left join dbo.CTC_GRP CG
on PCGU.CTC_GRP_ID = CG.CTC_GRP_ID
)
select *
from
(
select c1.proj_id,
c1.CTC_GRP_DS,
STUFF(
(SELECT ', ' + c2.name
FROM cte c2
where c1.proj_id = c2.proj_id
and c1.CTC_GRP_DS = c2.CTC_GRP_DS
FOR XML PATH (''))
, 1, 1, '') AS name
from cte c1
) d
pivot
(
max(name)
for CTC_GRP_DS in ([Bank Contact],[Dept2])
) piv;
请参见我现在明白了,我忘记了列出解决方案中的所有用户。这对于XML路径是一种非常优雅的解决方法。我以前没用过。直接进入我的工具箱。非常感谢。
;with cte as
(
SELECT PCGU.PROJ_ID,
name = u.USER_LST_NM + ', '+ u.USER_FIRST_NM,
CTC_GRP_DS
FROM dbo.[user] u
left join dbo.proj_ctc_grp_usr PCGU
on u.USER_ID = PCGU.USER_ID
left join dbo.CTC_GRP CG
on PCGU.CTC_GRP_ID = CG.CTC_GRP_ID
)
select *
from
(
select c1.proj_id,
c1.CTC_GRP_DS,
STUFF(
(SELECT ', ' + c2.name
FROM cte c2
where c1.proj_id = c2.proj_id
and c1.CTC_GRP_DS = c2.CTC_GRP_DS
FOR XML PATH (''))
, 1, 1, '') AS name
from cte c1
) d
pivot
(
max(name)
for CTC_GRP_DS in ([Bank Contact],[Dept2])
) piv;