由於您使用的是SQL Server,因此您可以同時使用UNPIVOT
和PIVOT
函數來轉換此數據。如果你知道有多少值,你會有那麼你可以硬編碼類似這樣的價值觀:
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
感謝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
@Matt未轉換的所有列的數據類型必須相同。所以你必須執行類似於我爲eventdate所做的轉換。如果你想,請創建一個[sql小提琴](http://sqlfiddle.com/)與您的表格和一些示例數據,以便我可以測試。 :) – Taryn
如上所述,在更改數據類型後,第一條語句生效。 第二個陳述,有一些小問題,如')'。我試圖改變')',但沒有奏效。讓我用SQL小提琴創建模式。我會告訴你。謝謝 – Matt