考慮下面的表和行列:轉換行允許重複
上市A.
ID, name, event, type
1, 'John Doe', '2010-09-01 15:00:00.000', 'input'
1, 'John Doe', '2010-09-03 11:00:00.000', 'input'
1, 'John Doe', '2010-09-04 17:00:00.000', 'input'
1, 'John Doe', '2010-09-02 15:00:00.000', 'output'
1, 'John Doe', '2010-09-03 16:00:00.000', 'output'
1, 'John Doe', '2010-09-06 17:00:00.000', 'output'
我想要的是將行轉換成列,所以我可以有兩個不同的列,輸入事件並輸出事件。像:
上市B.
ID, name, input event, output event
1, 'John Doe', '2010-09-01 15:00:00.000', '2010-09-02 15:00:00.000'
1, 'John Doe', '2010-09-03 11:00:00.000', '2010-09-03 16:00:00.000'
1, 'John Doe', '2010-09-04 17:00:00.000', '2010-09-06 17:00:00.000'
我能得到類似如下:
清單C.
ID, name, input event, output event
1, 'John Doe', '2010-09-01 15:00:00.000', null
1, 'John Doe', '2010-09-03 11:00:00.000', null
1, 'John Doe', '2010-09-04 17:00:00.000', null
1, 'John Doe', null, '2010-09-02 15:00:00.000'
1, 'John Doe', null, '2010-09-03 16:00:00.000'
1, 'John Doe', null, '2010-09-06 17:00:00.000'
,但問題是如何平行,因爲重複元組的ID-name是相關的。要轉換行到列我通常這樣的代碼的東西:
select ID, name, max(case when type = 'input' then event else null end) as 'input event', max(case when type = 'output' then event else null end) as 'output event' from events group by ID, name
,但當然,本集團將要離開了重複,這就是我不想要什麼。
任何想法如何實現與查詢?
這將是一個便攜式SQL解決方案或postgresql,但任何想法非常感謝,很高興。
編輯:抱歉,遲到的答案。 AlexRednic和Mark Bannister的解決方案都能達到我想要的效果。我終於選擇了第二個,因爲它對我來說更加清晰。謝謝你的回答!
您還沒有表示如何將輸入和輸出事件聯繫起來。 ID和名稱本身不會這樣做,因爲每個類型有三個相同的ID和名稱的事件。從提供的數據中,ID,姓名和時間的組合可以唯一地識別每種類型的單個事件,但是單憑這一點對於無數代表性數據集是可靠的,還是可能存在多個輸出事件天)爲一個單一的ID,姓名和時間? – 2010-09-01 12:47:43
對於任何輸入事件,只能有一個輸出事件,輸出事件的日期總是比輸入事件更早。另外,輸入事件之後總會有輸出事件。不能有兩個連續的輸入事件。我的錯,所提供的數據集不符合這一點。我會糾正它。 – Gothmog 2010-09-01 17:36:37
更清晰,謝謝! – 2010-09-02 09:56:41