Sql server 将行切换为列

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 表*用户* 我正在使用以下查询:

我有一个表格项目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
表*用户*

我正在使用以下查询:

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;