- ベストアンサー
キーが同じを複数行を1行にまとめるには?
こんばんは。質問です! 例えば、 テーブルを結合して、以下の様な結果が返ってくるとして、 製品コード 取扱店 ------------------------- 001 あああ 001 いいい 001 ううう これを 製品コード 店1 店2 店3 ---------------------------------------------- 001 あああ いいい ううう と1レコードにするにはどうしたら、いいでしょうか?? 困っています。お願い致します!
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
横に展開する最大数を固定する必要があるけど・・ 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 製品コード ; な感じ。
その他の回答 (2)
- k_o_r_o_c_h_a_n
- ベストアンサー率55% (526/942)
追加の質問の意味が理解できませんが・・ 製品コード 取扱店 その他の項目 001 あああ アアア 001 いいい イ 001 ううう ウ を 製品コード 店1 店2 店3 その他の項目 001 あああ いいい ううう ○○○ にしたいのでしょうか? 集約した検索結果に、いずれか1つのレコードから情報を付加したいのであれば、 そのレコードを選択する基準さえはっきりすれば、1つのSQLで結合なしに 答えを出すことは可能かと思います。 (どのレコードでも良いというのも基準の一つですけど・・) ただ、今回のSQLは、クロス集計というより横展開しているだけの処理なので、 初めから、アプリケーション側で横展開すれば良いだけの話です、オラクルで横展開する合理性は感じません。 >どちらが良いと思われますか? (3)アプリケーションで集約する。 (4)1つのSQLで完全な横展開結果と導き出す。 いずれかを選択します。(私なら)
補足
こんにちは。 質問が曖昧で、申し訳ありませんでした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)ではビューとして作成しています。 ご回答お願い致します。
- k_o_r_o_c_h_a_n
- ベストアンサー率55% (526/942)
GROUP-BYのキー項目以外は、集計関数を使わないとエラーになります。 なので、max関数やmin関数を便宜上使いエラーを回避します。 decode(r,~)が取りうる値は、r番目の値かnullですので、nullは葬られ、 r番目の値が採用されます。
補足
こんにちは。ご回答ありがとうございます☆ 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をキーにして結合する。 どちらが良いと思われますか? ご存知でしたら、ご回答お願い致します。
補足
おはようございます。早速のご回答ありがとうございます☆ 重ねて質問なのですが、max(decode(r,・・))とは、 rの重複を避ける意味でmax関数を使用しているのですか? 「max(decode」で検索したところ、同じ処理SQLが複数件あったの ですが、max関数については説明されていませんでした。 ご回答よろしくお願い致します!