トップ回答者
複数行を1行にまとめたい

質問
-
■メンバーテーブルID 名前 住所1 山田太郎 東京都港区…2 山田次郎 東京都渋谷区…3 山田三郎 東京都新宿区…■学歴テーブルID 区分 卒業年 学校名1 1 2001 港区小学校1 2 2004 港区中学校1 3 2007 港区高校2 1 2001 渋谷区小学校2 2 2004 渋谷区中学校2 3 2007 渋谷区町高校3 1 2001 新宿区小学校3 2 2004 新宿区中学校3 3 2007 新宿区高校
としたとき、以下のように取得したいと思います。
■SELECT結果ID 名前 住所 卒業年1* 学校名1 卒業年2 学校名2 卒業年3 学校名31 山田太郎 東京都港区… 2001 港区小学校 2004 港区中学校 2007 港区高校2 山田次郎 東京都渋谷区… 2001 渋谷区小学校 2004 渋谷区中学校 2007 渋谷区高校3 山田三郎 東京都新宿区… 2001 新宿区小学校 2004 新宿区中学校 2007 新宿区高校
*=(区分)
SQL:複数行を1レコードにしたい 等を参考にしてみましたが、上手くいきません。
どなたか御指導お願いします。
- 編集済み hero.ws 2014年5月28日 16:59
回答
-
>道程の遠さにすぐさま質問をしてしまいました。
了解しました。確かにちょっと遠そうですので、とりあえず例を以下に示します。これを元にPIVOTの勉強をしてみて下さいね。
列数は固定で大丈夫ということだったので、区分は焼き込んでいます。SELECT ID, 名前, 住所, [1] 卒業年1, [2] 卒業年2, [3] 卒業年3, (select 学校名 from 学歴 where P.ID = ID and 区分 = 1) 学校名1, (select 学校名 from 学歴 where P.ID = ID and 区分 = 2) 学校名2, (select 学校名 from 学歴 where P.ID = ID and 区分 = 3) 学校名3 FROM (select m.ID, m.名前, m.住所, g.卒業年, g.区分 from 学歴 g inner join メンバー m on g.ID = m.id) as T PIVOT ( MIN(卒業年) FOR 区分 IN ([1], [2], [3]) ) AS P
★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
- 回答としてマーク hero.ws 2014年5月29日 13:26
すべての返信
-
-
trapemiya さん
早速の回答ありがとうございます。
SELECT ID, [1], [2], [3]
FROM history
PIVOT (
MIN(year)
FOR div IN ([1], [2], [3])
) AS P(history:学歴テーブル、year:卒業年、div:区分)
としたところ、
ID 1 2 31 NULL NULL 20071 2001 NULL NULL1 NULL 2004 NULL2 NULL NULL 20072 2001 NULL NULL2 NULL 2004 NULL3 NULL NULL 20073 2001 NULL NULL3 NULL 2004 NULLと出力された時点で、挫折…GROUP BY?ダメ。
まだ、メンバーテーブルの結合にも辿り着かないのに…
道程の遠さにすぐさま質問をしてしまいました。
記述を忘れていましたが、SQL Server 2012 にて、開発を行っています。
列数は固定で大丈夫です。
お付き合いよろしくお願いします。
- 編集済み hero.ws 2014年5月29日 3:31
-
>道程の遠さにすぐさま質問をしてしまいました。
了解しました。確かにちょっと遠そうですので、とりあえず例を以下に示します。これを元にPIVOTの勉強をしてみて下さいね。
列数は固定で大丈夫ということだったので、区分は焼き込んでいます。SELECT ID, 名前, 住所, [1] 卒業年1, [2] 卒業年2, [3] 卒業年3, (select 学校名 from 学歴 where P.ID = ID and 区分 = 1) 学校名1, (select 学校名 from 学歴 where P.ID = ID and 区分 = 2) 学校名2, (select 学校名 from 学歴 where P.ID = ID and 区分 = 3) 学校名3 FROM (select m.ID, m.名前, m.住所, g.卒業年, g.区分 from 学歴 g inner join メンバー m on g.ID = m.id) as T PIVOT ( MIN(卒業年) FOR 区分 IN ([1], [2], [3]) ) AS P
★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
- 回答としてマーク hero.ws 2014年5月29日 13:26
-
>PIVOTでは、1つの列(今回の例では「卒業年」)しか指定できないから、「学校名」については取得の仕方が違うのでしょうか。
1つの列でしか指定できないのはその通りです。ですからできあがったPIVOTテーブルからselectする際にサブクエリで「学校名」を求めています。PIVOTテーブルを作成してしまえば、後は普通のテーブルと同じように扱ってselect文を発行するだけです。
>私は「区分」で振り分けた複数列が都合良く取得できるものと勘違いしていました。
「区分」で振り分けるというか「区分」ごとに集計するものを一つしか指定できないので(今回の場合は「min(卒業年)」)、それ以外の列を生成することはできません。よって、上で書いたようにサブクエリで後から追加しています。
>もう暫く試行錯誤を繰り返し、PIVOTの使い方を理解したいと思います。
試行錯誤される際は、SQL Server Management Studioのクエリ作成画面で試されると便利ですよ。インテリジェンスも効きますし、逆にインテリジェンスからここはこういう扱いになっているんだってこともわかります。私もPIVOTはこのようにして理解を深めました。
★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
- 編集済み trapemiya 2014年5月30日 1:42 誤字修正