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

我试过了,结果没有运气......请帮忙......

4

2 回答 2

2

要获得结果,您需要做一些事情。

首先,您当前使用 PIVOT 的查询不正确。您正在尝试获取数据MAX(CTC_GRP_DS)中的每个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

于 2013-08-19T13:13:58.010 回答
1

你很亲密。但是您在枢轴中的聚合函数应该是您在枢轴后想要的值。因此,由于您在聚合和 FOR 中都使用 CTC_GRP_DS,因此您最终会将旋转列名称作为值。希望您可以使用下面的查询。注意:您在查询中拥有的 Project 表尚未呈现,因此您可能必须包含该表。

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
于 2013-08-19T13:10:11.510 回答