2012-12-04 117 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