次のテーブルと行を検討してください。
リスト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'
行を列に変換したいので、入力イベントと出力イベントの 2 つの異なる列を作成できます。お気に入り:
リスト 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
、しかしもちろん、GROUP BY は重複を除外します。それは私が望んでいないことです。
クエリでそれを達成する方法はありますか?
移植可能な sql ソリューションまたは postgresql があると便利ですが、どんなアイデアでも大歓迎です。
編集:返事が遅くなってすみません。AlexRednic と Mark Bannister の両方のソリューションは、私が望んでいたことを実現します。最終的には 2 番目のものを選択しました。回答ありがとうございます。