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)データのfor eachを取得しようとしてい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 に答える