2013-08-19 76 views
1

我有一个表proj_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_grp:**

CTC_GRP_ID  CTC_GRP_DS 
1    Bank Contact 
2   Dept2 

表* 用户 *

USER_ID USER_FIRST_NM USER_LST_NM 
2   saravanakumar rajkumar 
3   Soosai   Antony 
4   Adam   Allen 

我使用以下查询:

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... 

我试了一下&结束了,没有运气...请帮助它...

回答

2

您需要做几件事才能得到结果。

首先,您使用PIVOT的当前查询不正确。您正在尝试为您的数据中的每个CTC_GRP_DS获取MAX(CTC_GRP_DS)。您实际上想要在数据中返回每个CTC_GRP_DS的名称。

其次,您需要将首字母和姓氏拼接在一起,并且还希望连接每个项目的名称列表。你可以使用FOR XML PATH来完成这个连接。

;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; 

SQL Fiddle with Demo

+0

我现在,我已经忘记了列出所有用户在我的解决方案看。这个FOR XML PATH是解决这个问题的一种非常优雅的方式。我以前没有用过。直接进入我的工具箱。谢谢! –

+0

谢谢,我试过了,得到了积极的结果。我必须学习枢轴的概念... – sk7730

1

你非常接近。但是,你在pivot中的聚合函数应该是你想要的值。因此,由于您在聚合和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