0

非常に複雑なクエリがあります。2行のデータを1行に結合したい。

次の出力が得られます

         PNAME    RN         LVN        HA         MSW       SC
           AA     AG-1W      SS-1M     LO-2W      PA-1W      SK-1M
           AA     JL-1W      TD -1M     NULL      NULL       NULL

結果を 1 行にするか、2 行を 1 つに結合する方法はありますか。次のように。

            PNAME      RN         LVN        HA        MSW         SC
             AA       AG-1W      SS-1M     LO-2W      PA-1W      SK-1M
                      JL-1W      TD -1M     NULL       NULL       NULL
4

1 に答える 1

1

何を達成しようとしているのかは明確ではありませんが、 の使用を実装して、 が追加の行に表示されrow_number()ないようにすることができます。pname

select case when rownum = 1 then pname else '' end pname, 
    [RN], [LVN], [HA], [MSW], [SC]
from
(
    select pname, disc, value,
        ROW_NUMBER() over(partition by disc order by disc) rownum
    from temp
) src
pivot
(
    max(value)
    for disc in ([RN], [LVN], [HA], [MSW], [SC])
) piv

デモで SQL Fiddle を参照してください

結果:

| PNAME |    RN |   LVN |     HA |    MSW |     SC |
----------------------------------------------------
|    AA | AG-1W | SS-1M |  LO-2W |  PA-1W |  SK-1M |
|       | JL-1W | TD-1M | (null) | (null) | (null) |

これは の値を使用して、を表示row_number()するかどうかを決定しpnameます。の場合のみ値が表示されrownum=1、それ以外の場合は空白になります。

単一行のデータが必要な場合は、次のようなものを使用できます。

;with cte as
(
  select pname, disc, value,
    ROW_NUMBER() over(partition by disc order by disc) rownum
  from temp
),
piv as 
(
  select * 
  from cte
  pivot
  (
    max(value)
    for disc in ([RN], [LVN], [HA], [MSW], [SC])
  ) piv
)
select pname,
  STUFF((SELECT distinct ', ' + [RN]  
              from piv p2
              where p1.pname = p2.pname
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'') RN,
  STUFF((SELECT distinct ', ' + [LVN]  
              from piv p2
              where p1.pname = p2.pname
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'') LVN,
  STUFF((SELECT distinct ', ' + [HA]  
              from piv p2
              where p1.pname = p2.pname
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'') HA,
  STUFF((SELECT distinct ', ' + [MSW]  
              from piv p2
              where p1.pname = p2.pname
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'') MSW,   
  STUFF((SELECT distinct ', ' + [SC]  
              from piv p2
              where p1.pname = p2.pname
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'') SC   
from piv p1
group by pname

デモで SQL Fiddle を参照してください

結果は次のとおりです。

| PNAME |            RN |           LVN |     HA |    MSW |     SC |
--------------------------------------------------------------------
|    AA |  AG-1W, JL-1W |  SS-1M, TD-1M |  LO-2W |  PA-1W |  SK-1M |
于 2012-11-12T14:10:41.203 に答える