• ベストアンサー

キーが同じを複数行を1行にまとめるには?

こんばんは。質問です! 例えば、 テーブルを結合して、以下の様な結果が返ってくるとして、 製品コード  取扱店 ------------------------- 001      あああ 001      いいい 001      ううう これを 製品コード  店1    店2     店3 ---------------------------------------------- 001      あああ    いいい   ううう と1レコードにするにはどうしたら、いいでしょうか?? 困っています。お願い致します!

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

横に展開する最大数を固定する必要があるけど・・ select 製品コード,max(decode(r,1,取扱店)) 店1,max(decode(r,2,取扱店)) 店2,max(decode(r,3,取扱店)) 店3 from (select x.*,row_number() over(partition by 製品コード order by 取扱店) r from TARGET x) group by 製品コード ; な感じ。

system0001
質問者

補足

おはようございます。早速のご回答ありがとうございます☆ 重ねて質問なのですが、max(decode(r,・・))とは、 rの重複を避ける意味でmax関数を使用しているのですか? 「max(decode」で検索したところ、同じ処理SQLが複数件あったの ですが、max関数については説明されていませんでした。 ご回答よろしくお願い致します!

その他の回答 (2)

回答No.3

追加の質問の意味が理解できませんが・・ 製品コード 取扱店 その他の項目 001     あああ アアア 001     いいい イ 001     ううう ウ を 製品コード 店1  店2  店3  その他の項目 001     あああ いいい ううう ○○○ にしたいのでしょうか? 集約した検索結果に、いずれか1つのレコードから情報を付加したいのであれば、 そのレコードを選択する基準さえはっきりすれば、1つのSQLで結合なしに 答えを出すことは可能かと思います。 (どのレコードでも良いというのも基準の一つですけど・・) ただ、今回のSQLは、クロス集計というより横展開しているだけの処理なので、 初めから、アプリケーション側で横展開すれば良いだけの話です、オラクルで横展開する合理性は感じません。 >どちらが良いと思われますか? (3)アプリケーションで集約する。 (4)1つのSQLで完全な横展開結果と導き出す。 いずれかを選択します。(私なら)

system0001
質問者

補足

こんにちは。 質問が曖昧で、申し訳ありませんでしたm(_ _)m 製品コード 製品名 製造工場 取扱店 001     製品A 工場A  あああ 001     製品A 工場A  いいい  001     製品A 工場A  ううう ※結合して、 製品コード・製品名は製品テーブルから、 製造工場は工場テーブルから、 取扱店は卸売テーブルから取得しているとします。 を 製品コード 製品名 製造工場 店1  店2  店3 001     製品A 工場A  あああ いいい ううう と取得したいのですが、 教えて頂いたSQLでは、 製品コードでグルーピングしているので、製品名、製造工場が GRUOP-BYエラーに引っかかってしまうので、 (1)製品コードと取扱店を横展開して取得するSQLと、 製品コードと製品名と製造工場を取得するSQLをFROM句で結合し、製品コードをキーに結果を出す。 (2)製品コードと取扱店を横展開して取得するSQLと、 製品コードと製品名と製造工場を取得するSQLを 別発行し、Javaで製品コードをキーにして、1レコードにまとめる。 という意味でした。 今のところ、(1)のやり方で行っております。 そこで、パフォーマンス上、どちらが良いでしょうか? ちなみに今回は、(1)ではビューとして作成しています。 ご回答お願い致します。

回答No.2

GROUP-BYのキー項目以外は、集計関数を使わないとエラーになります。 なので、max関数やmin関数を便宜上使いエラーを回避します。 decode(r,~)が取りうる値は、r番目の値かnullですので、nullは葬られ、 r番目の値が採用されます。

system0001
質問者

補足

こんにちは。ご回答ありがとうございます☆ GROUP-BYに指定していないカラムをSELECT句に記述していたので、 エラーが出ていましたが、取り除いたところ取得できました! ありがとうございます♪ ところで、今、JavaとOracleを使用して開発をしておりますが、 上記のSELECT句に記述していたカラムも取得しなければなりません。 そこで、 (1)GROUP-BY指定SQLとGROUP-BYなしSQLを2回発行して、 Javaで製品CDをキーにして1レコードに結合する。 (2)GROUP-BY指定SQLとGROUP-BYなしSQLをそれぞれビューとして 作成し、製品CDをキーにして結合する。 どちらが良いと思われますか? ご存知でしたら、ご回答お願い致します。

関連するQ&A