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

目前尚不清楚您要实现的目标,但您可以实现使用 ofrow_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 回答