- ベストアンサー
集計のSQLについて
皆さんの知恵をお借りしたいと思っています。 どなたか、良い案がある方お願いいたします。 以下のテーブルがあります。 (売上テーブル) 品名 金額 購入者 ---------------------------- 鉛筆 20 Aさん 鉛筆 40 Bさん 鉛筆 30 Bさん 鉛筆 30 鉛筆 10 上のテーブルで、品名・購入者を集計キーとして、 金額を集計したい場合、 SELECT 品名,購入者,SUM(金額) FROM 売上テーブル GROUP BY 品名,購入者 というSQL文で, 品名 金額 購入者 ---------------------------- 鉛筆 20 Aさん 鉛筆 70 Bさん 鉛筆 40 という結果が得られると思いますが・・・、 これを、 品名 金額 購入者 ---------------------------- 鉛筆 20 Aさん 鉛筆 70 Bさん 鉛筆 30 鉛筆 10 という結果になるようなSQL文を作りたいのです。 購入者が入っているものについては、品名・購入者で集計して、 購入者が空欄のものは集計しないようにしたいと思っています。 UNIONを使えばできるとは思うのですが、 それ以外の方法で、1回のSQL文でできる方法があれば知りたいと思っています。 よろしくお願いします。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
こんばんは。 group by 品名, 購入者, nvl(購入者, rowidtochar(rowid)) は、どうでしょうか?
その他の回答 (5)
- y-kawamura
- ベストアンサー率0% (0/15)
まず”鉛筆”30,10の購入者の部分の内容を調べてみては? 通常購入者が同じNULLなら集計されるはず。 表示されない、スペースなどが入っていませんか? Select文を実行する前に"SET NULL _"などNULLを みれるようにして実行してみては?
補足
質問文が分かりづらかったかもしれませんが、 今回、NULLのものについては集計したくないので、質問をさせていただきました。 疑問点の本筋から外れるため、質問文には書いていなかったのですが、 購入者の部分については、実際にはもう少し厳密に、 TRIM(購入者)がNULLかどうか、という扱いをしています。 ちなみに、SET NULLについては、知らない知識だったので1つ勉強になりました。私は、まだまだ知識が浅いなあと思いました。 ありがとうございました。
- ryoppemag
- ベストアンサー率15% (15/96)
Aさん Bさん の集計部分と購入者が空欄のものを別のSELECTにして、UNIONでくっつけちゃだめ?
お礼
回答ありがとうございます。 私も、真っ先にその方法を思いついたのですが、 それはしないで欲しいということになったため、 今回質問をさせていただいた次第です。 今回は、他の方のアイディアをいただくことにしました。
- kazuho_goo
- ベストアンサー率56% (34/60)
No.2です。 すみません、先ほどSQLを書き忘れました。 select 品名, sum(金額), 購入者 from 売上テーブル group by 品名, 購入者, rollup(金額) having( grouping(金額) = 0 and 購入者 is Null) or (grouping(金額) = 1 and 購入者 is not Null) ;
お礼
いただいたSQL文で、ばっちり動きました! ただ、今回のプログラムを、今後他の人がメンテナンスする可能性があるため、 比較的、誰にでも分かりやすい方法をとることにしました。 (私の周囲には、ROLLUPなどを使いこなせる人がいません。私もこの回答をいただくまで知りませんでした。) 一つの結果を出すにも、方法が何通りもあるものですね。 いろいろと勉強にもなりました。 本当にありがとうございました。
- kazuho_goo
- ベストアンサー率56% (34/60)
group by grouping sets ((品名, 購入者), (品名, 金額, 購入者)) や group by grouping rollup(品名, 金額, 購入者) などを使って 該当する条件をhavig句で指定すれば、できないことはないのですが、かなり複雑で解りづらいSQLになってしまいます。何か良い方法がありましたら、また書き込みします。
- taka_tetsu
- ベストアンサー率65% (1020/1553)
売上テーブルの主キーを加工した値を集計条件に含めてください。 DECODE(購入者, NULL, 主キー) 見たいな感じで。 そうすれば、購入者がNULLのレコードはDECODEの結果が主キーに、購入者がNULLでなければNULLになるので お望みの結果が得られるかと。 一意に特定できるような項目がないのであれば、不可能かと。シーケンスとか使えばできないことはないかもしれませんが。
お礼
早速の回答ありがとうございます。 自分の周囲の人に聞いても良い案がなかったので、 正直あきらめ半分で質問させていただいたのですが、 たくさんの回答をいただいたので、うれしいです。 今回は、集計条件に主キーを含めるというアイディアを使わせていただきます。 NO5の方のアイディアと合わせて、 group by 品名, 購入者, nvl(購入者, 主キー) という感じにしました。 仕事で必要だったため、とても助かりました。 ありがとうございました。
お礼
回答ありがとうございます。 NVLを使うという案、使わせていただきます。 今回のテーブルには、ちょうど主キーがあるので、 NO1の方の、主キーを使うというアイディアと合わせて、 group by 品名, 購入者, nvl(購入者, 主キー) という感じにしました。 ただ、扱っているテーブルの中に、 主キーが存在しないテーブルが、少しあるので、 もしかしたら、 nvl(購入者, rowidtochar(rowid)) の部分を、そのまま使わせていただくことがあるかもしれません。 NVLはいつも使っている関数なのですが、 今回のSQL文で、このように使うということを思いつきませんでした。 今回とても助かりました。 ありがとうございました。