2012-11-11 63 views
0

我有一個非常複雜的查詢。我想把2行數據合併到1行中。將來自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行的結果或1。像如下合併2行。

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

可以嘗試用通過...分組? – bonCodigo

+0

Forogot詢問你的表模式定義。你能分享嗎? – bonCodigo

+0

是否有任何通用的方法來做到這一點 – user1764540

回答

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 with demo

結果:

| 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 with Demo

結果是:

| PNAME |   RN |   LVN |  HA | MSW |  SC | 
-------------------------------------------------------------------- 
| AA | AG-1W, JL-1W | SS-1M, TD-1M | LO-2W | PA-1W | SK-1M | 
+0

太謝謝你了爲解決方案。可能我不清楚在上一篇文章中我想要什麼。不是將結果顯示在不同的行中,也沒有PNAME,可以僅以僅一行的方式顯示它們。行以某種方式合併 – user1764540

+0

@ user1764540請參閱我的編輯,它將值連接成單行但不包含換行符,它在值之間使用逗號 – Taryn