SQLの質問です。


テーブルXが以下のようになっており、

 IDa IDb
 ----------------
 1  b1
 1  b2
 1  b3
 2  b4
 2  b5
 3  b6

次のような結果を得たいと考えています。
SELECT文1本で書ける方法はありますでしょうか?

 1 b1 b2 b3
 2 b4 b5
 3 b6

PostgreSQLを使用しています。

回答の条件
  • 1人3回まで
  • 登録:
  • 終了:2006/05/17 12:06:27
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:asakura-t No.3

回答回数151ベストアンサー獲得回数2

ポイント60pt

select ida, array(select idb from x as x2 where x.ida=x2.ida) from x;

では駄目でしょうか?

id:katsube

あ、なるほど。

配列と自己結合使えばいいんですね!これは思いつきませんでした。

先ほど試してみたら、

 1 b1 b2 b3

 1 b1 b2 b3

 1 b1 b2 b3

 2 b4 b5

 2 b4 b5

 3 b6

って感じになってしまったので、とりあえずdistinctつけて解決しました。

#あ、distinctじゃなくて結合うまいこと

#調整すればいきそうな気もしますが、

#どなたかお分かりになられたら

#ついでに教えてください(^^;

2006/05/17 00:14:34

その他の回答3件)

id:tamo2_xvi No.1

回答回数436ベストアンサー獲得回数10

ポイント1pt

select IDa,IDb from テーブルx where IDb like 'b%';

では如何でしょうか?

id:katsube

それだと、結果が

 1  b1

 1  b2

 1  b3

 2  b4

 2  b5

 3  b6

にならないでしょうか?

ちなみに、列数が合わない空欄部分はNullが出力されればOKです。

2006/05/16 16:00:29
id:tamo2_xvi No.2

回答回数436ベストアンサー獲得回数10

ポイント1pt

sqlではここまでにして、後はphpなどで加工した方が

早いような気がします。

頻繁に使うようであれば、引き出したいデータ形式にした

テーブルを作成しリレーションされては如何でしょうか?

id:katsube

早いかどうかは問題でなく、今回の質問の主題は、これらをSQLで出来ないか、ということです。

もともと、サマリー用のテーブルを用意する、プログラムで加工するなどの手法を考えていました。

ピントのずれた回答はご勘弁ください。

2006/05/16 16:37:57
id:asakura-t No.3

回答回数151ベストアンサー獲得回数2ここでベストアンサー

ポイント60pt

select ida, array(select idb from x as x2 where x.ida=x2.ida) from x;

では駄目でしょうか?

id:katsube

あ、なるほど。

配列と自己結合使えばいいんですね!これは思いつきませんでした。

先ほど試してみたら、

 1 b1 b2 b3

 1 b1 b2 b3

 1 b1 b2 b3

 2 b4 b5

 2 b4 b5

 3 b6

って感じになってしまったので、とりあえずdistinctつけて解決しました。

#あ、distinctじゃなくて結合うまいこと

#調整すればいきそうな気もしますが、

#どなたかお分かりになられたら

#ついでに教えてください(^^;

2006/05/17 00:14:34
id:asakura-t No.4

回答回数151ベストアンサー獲得回数2

ポイント28pt

DISTINCTを全く使わないのは無理でしょう。

SELECTのところでDISTINCTを使いたくないのであれば、

SELECT ida, array(略) FROM (SELECT DISTINCT ida FROM x) AS x;

という手もあります。

id:katsube

なるほど、ありがとうございました。

2006/05/17 12:05:22

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません