2013-08-19 106 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