• ベストアンサー

集計の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文でできる方法があれば知りたいと思っています。 よろしくお願いします。

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

  • ベストアンサー
  • jmh
  • ベストアンサー率23% (71/304)
回答No.5

こんばんは。 group by 品名, 購入者, nvl(購入者, rowidtochar(rowid)) は、どうでしょうか?

cucsna
質問者

お礼

回答ありがとうございます。 NVLを使うという案、使わせていただきます。 今回のテーブルには、ちょうど主キーがあるので、 NO1の方の、主キーを使うというアイディアと合わせて、 group by 品名, 購入者, nvl(購入者, 主キー) という感じにしました。 ただ、扱っているテーブルの中に、 主キーが存在しないテーブルが、少しあるので、 もしかしたら、 nvl(購入者, rowidtochar(rowid)) の部分を、そのまま使わせていただくことがあるかもしれません。 NVLはいつも使っている関数なのですが、 今回のSQL文で、このように使うということを思いつきませんでした。 今回とても助かりました。 ありがとうございました。

その他の回答 (5)

回答No.6

まず”鉛筆”30,10の購入者の部分の内容を調べてみては? 通常購入者が同じNULLなら集計されるはず。 表示されない、スペースなどが入っていませんか? Select文を実行する前に"SET NULL _"などNULLを みれるようにして実行してみては?

cucsna
質問者

補足

質問文が分かりづらかったかもしれませんが、 今回、NULLのものについては集計したくないので、質問をさせていただきました。 疑問点の本筋から外れるため、質問文には書いていなかったのですが、 購入者の部分については、実際にはもう少し厳密に、 TRIM(購入者)がNULLかどうか、という扱いをしています。 ちなみに、SET NULLについては、知らない知識だったので1つ勉強になりました。私は、まだまだ知識が浅いなあと思いました。 ありがとうございました。

  • ryoppemag
  • ベストアンサー率15% (15/96)
回答No.4

Aさん Bさん の集計部分と購入者が空欄のものを別のSELECTにして、UNIONでくっつけちゃだめ?

cucsna
質問者

お礼

回答ありがとうございます。 私も、真っ先にその方法を思いついたのですが、 それはしないで欲しいということになったため、 今回質問をさせていただいた次第です。 今回は、他の方のアイディアをいただくことにしました。

回答No.3

No.2です。 すみません、先ほどSQLを書き忘れました。 select 品名, sum(金額), 購入者 from 売上テーブル group by 品名, 購入者, rollup(金額) having( grouping(金額) = 0 and 購入者 is Null) or (grouping(金額) = 1 and 購入者 is not Null) ;

cucsna
質問者

お礼

いただいたSQL文で、ばっちり動きました! ただ、今回のプログラムを、今後他の人がメンテナンスする可能性があるため、 比較的、誰にでも分かりやすい方法をとることにしました。 (私の周囲には、ROLLUPなどを使いこなせる人がいません。私もこの回答をいただくまで知りませんでした。) 一つの結果を出すにも、方法が何通りもあるものですね。 いろいろと勉強にもなりました。 本当にありがとうございました。

回答No.2

group by grouping sets ((品名, 購入者), (品名, 金額, 購入者)) や group by grouping rollup(品名, 金額, 購入者) などを使って 該当する条件をhavig句で指定すれば、できないことはないのですが、かなり複雑で解りづらいSQLになってしまいます。何か良い方法がありましたら、また書き込みします。

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.1

売上テーブルの主キーを加工した値を集計条件に含めてください。 DECODE(購入者, NULL, 主キー) 見たいな感じで。 そうすれば、購入者がNULLのレコードはDECODEの結果が主キーに、購入者がNULLでなければNULLになるので お望みの結果が得られるかと。 一意に特定できるような項目がないのであれば、不可能かと。シーケンスとか使えばできないことはないかもしれませんが。

cucsna
質問者

お礼

早速の回答ありがとうございます。 自分の周囲の人に聞いても良い案がなかったので、 正直あきらめ半分で質問させていただいたのですが、 たくさんの回答をいただいたので、うれしいです。 今回は、集計条件に主キーを含めるというアイディアを使わせていただきます。 NO5の方のアイディアと合わせて、 group by 品名, 購入者, nvl(購入者, 主キー) という感じにしました。 仕事で必要だったため、とても助かりました。 ありがとうございました。

関連するQ&A