dポイントプレゼントキャンペーン実施中!

こんばんは。質問です!
例えば、
テーブルを結合して、以下の様な結果が返ってくるとして、
製品コード  取扱店
-------------------------
001      あああ
001      いいい
001      ううう

これを
製品コード  店1    店2     店3
----------------------------------------------
001      あああ    いいい   ううう

と1レコードにするにはどうしたら、いいでしょうか??

困っています。お願い致します!

A 回答 (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 製品コード
;

な感じ。

この回答への補足

おはようございます。早速のご回答ありがとうございます☆

重ねて質問なのですが、max(decode(r,・・))とは、
rの重複を避ける意味でmax関数を使用しているのですか?

「max(decode」で検索したところ、同じ処理SQLが複数件あったの
ですが、max関数については説明されていませんでした。

ご回答よろしくお願い致します!

補足日時:2007/07/12 10:32
    • good
    • 1

追加の質問の意味が理解できませんが・・



製品コード 取扱店 その他の項目
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)ではビューとして作成しています。

ご回答お願い致します。

補足日時:2007/07/14 14:20
    • good
    • 0

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をキーにして結合する。

どちらが良いと思われますか?
ご存知でしたら、ご回答お願い致します。

補足日時:2007/07/12 14:04
    • good
    • 1

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

関連するカテゴリからQ&Aを探す


このQ&Aを見た人がよく見るQ&A