2012-12-04 115 views
0

我想将行转换为列。这里是我的查询
SQL Server- PIVOT表。将行转换为列

SELECT M.urn, 
     M.eventdate, 
     M.eventlocation, 
     M.eventroom, 
     M.eventbed, 
     N.time 
FROM admpatevents M 
     INNER JOIN admpattransferindex N 
       ON M.urn = N.urn 
        AND M.eventseqno = N.eventseqno 
        AND M.eventdate = N.eventdate 
WHERE M.urn = 'F1002754364' 
     AND M.eventcode = 'TFRADMIN' 

当前结果

URN   Date  Location Room Bed Time 
F1002754364 20121101 EDEXPRESS 4-152 02  0724 
F1002754364 20121101 CARDSURG 3-110 02  1455 
F1002754364 20121102 CHEST UNIT 6-129-GL04  1757

所需的结果

F1002754364 20121101 EDEXPRESS 4-152 02 0724 20121101 CARDSURG 3-110 02 1455 20121102 CHEST UNIT 6-129-GL 04 1757

感谢您的帮助。

回答

1

由于您使用的是SQL Server,因此您可以同时使用UNPIVOTPIVOT函数来转换此数据。如果你知道有多少值,你会有那么你可以硬编码类似这样的价值观:

select * 
from 
(
    select urn, 
     value, 
     col +'_'+ CAST(rn as varchar(10)) as col 
    from 
    (
     SELECT M.urn, 
      cast(M.eventdate as varchar(50)) eventdate, 
      M.eventlocation, 
      M.eventroom, 
      M.eventbed, 
      cast(N.time as varchar(50)) time, 
      ROW_NUMBER() over(PARTITION by m.urn order by m.eventdate) rn 
     FROM admpatevents M 
     INNER JOIN admpattransferindex N 
      ON M.urn = N.urn 
      AND M.eventseqno = N.eventseqno 
      AND M.eventdate = N.eventdate 
     WHERE M.urn = 'F1002754364' 
      AND M.eventcode = 'TFRADMIN' 
    ) src1 
    unpivot 
    (
     value 
     for col in (eventdate, eventlocation, eventroom, eventbed, time) 
    ) unpiv 
) src2 
pivot 
(
    max(value) 
    for col in ([eventdate_1], [eventlocation_1], [eventroom_1], [eventbed_1], [time_1], 
       [eventdate_2], [eventlocation_2], [eventroom_2], [eventbed_2], [time_2], 
       [eventdate_3], [eventlocation_3], [eventroom_3], [eventbed_3], [time_3]) 
) piv 

没有测试

如果你有一个未知的列数,然后注意 - 你可以使用动态SQL与此类似:

DECLARE @query AS NVARCHAR(MAX), 
    @colsPivot as NVARCHAR(MAX) 

select @colsPivot = STUFF((SELECT ',' 
         + quotename(c.name +'_'+ cast(t.rn as varchar(10))) 
        from 
        (
         select ROW_NUMBER() over(PARTITION by m.urn order by m.eventdate) rn 
         FROM admpatevents M 
         INNER JOIN admpattransferindex N 
          ON M.urn = N.urn 
          AND M.eventseqno = N.eventseqno 
          AND M.eventdate = N.eventdate 
         WHERE M.urn = 'F1002754364' 

        ) t 
        cross apply sys.columns as C 
        where C.object_id IN (object_id('admpatevents'), object_id('admpattransferindex')) and 
         C.name not in ('urn') -- add any other columns your want to exclude 
        group by c.name, t.rn 
        order by t.rn 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 


set @query 
    = 'select * 
    from 
    (
     select urn, value, col +''_''+ CAST(rn as varchar(10)) as col 
     from 
     (
      SELECT M.urn, 
       cast(M.eventdate as varchar(20)) eventdate, 
       M.eventlocation, 
       M.eventroom, 
       M.eventbed, 
       cast(N.time as varchar(20)) time, 
       ROW_NUMBER() over(PARTITION by m.urn order by m.eventdate) rn 
      FROM admpatevents M 
      INNER JOIN admpattransferindex N 
       ON M.urn = N.urn 
       AND M.eventseqno = N.EVENTseqno 
       AND M.eventdate = N.eventdate 
      WHERE M.urn = ''F1002754364'' 

     ) x 
     unpivot 
     (
     value 
     for col in (eventdate, eventlocation, eventroom, eventbed, time) 
     ) u 
    ) x1 
     pivot 
     (
     max(value) 
     for col in ('+ @colspivot +') 
    ) p' 

exec(@query) 

SQL Fiddle with Demo

+0

感谢help.I当我跑b我得到错误其他陈述。 第一条语句错误:“eventlocation”列的类型与UNPIVOT列表中指定的其他列的类型冲突。 Second Statement error:Msg 156,Level 15,State 1,Line 7 关键字'SELECT'附近的语法不正确。 Msg 102,Level 15,State 1,Line 21 ')'附近语法不正确。 再次感谢 – Matt

+0

@Matt未转换的所有列的数据类型必须相同。所以你必须执行类似于我为eventdate所做的转换。如果你想,请创建一个[sql小提琴](http://sqlfiddle.com/)与您的表格和一些示例数据,以便我可以测试。 :) – Taryn

+0

如上所述,在更改数据类型后,第一条语句生效。 第二个陈述,有一些小问题,如')'。我试图改变')',但没有奏效。让我用SQL小提琴创建模式。我会告诉你。谢谢 – Matt