みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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

よろしくお願いします。

投稿日時 - 2004-06-21 12:59:35

QNo.899640

すぐに回答ほしいです

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

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

投稿日時 - 2004-06-22 00:19:08

お礼

回答ありがとうございます。

NVLを使うという案、使わせていただきます。
今回のテーブルには、ちょうど主キーがあるので、
NO1の方の、主キーを使うというアイディアと合わせて、
group by 品名, 購入者, nvl(購入者, 主キー)
という感じにしました。

ただ、扱っているテーブルの中に、
主キーが存在しないテーブルが、少しあるので、
もしかしたら、
nvl(購入者, rowidtochar(rowid))
の部分を、そのまま使わせていただくことがあるかもしれません。

NVLはいつも使っている関数なのですが、
今回のSQL文で、このように使うということを思いつきませんでした。

今回とても助かりました。
ありがとうございました。

投稿日時 - 2004-06-23 12:53:08

ANo.5

このQ&Aは役に立ちましたか?

11人が「このQ&Aが役に立った」と投票しています

回答(6)

ANo.6

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

投稿日時 - 2004-06-22 09:56:18

補足

質問文が分かりづらかったかもしれませんが、
今回、NULLのものについては集計したくないので、質問をさせていただきました。

疑問点の本筋から外れるため、質問文には書いていなかったのですが、
購入者の部分については、実際にはもう少し厳密に、
TRIM(購入者)がNULLかどうか、という扱いをしています。

ちなみに、SET NULLについては、知らない知識だったので1つ勉強になりました。私は、まだまだ知識が浅いなあと思いました。
ありがとうございました。

投稿日時 - 2004-06-23 12:53:51

ANo.4

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

投稿日時 - 2004-06-21 14:30:50

お礼

回答ありがとうございます。

私も、真っ先にその方法を思いついたのですが、
それはしないで欲しいということになったため、
今回質問をさせていただいた次第です。

今回は、他の方のアイディアをいただくことにしました。

投稿日時 - 2004-06-23 12:46:14

ANo.3

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

投稿日時 - 2004-06-21 14:20:01

お礼

いただいたSQL文で、ばっちり動きました!

ただ、今回のプログラムを、今後他の人がメンテナンスする可能性があるため、
比較的、誰にでも分かりやすい方法をとることにしました。
(私の周囲には、ROLLUPなどを使いこなせる人がいません。私もこの回答をいただくまで知りませんでした。)

一つの結果を出すにも、方法が何通りもあるものですね。
いろいろと勉強にもなりました。
本当にありがとうございました。

投稿日時 - 2004-06-23 12:41:05

ANo.2

group by grouping sets
((品名, 購入者), (品名, 金額, 購入者))

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

投稿日時 - 2004-06-21 14:05:20

ANo.1

売上テーブルの主キーを加工した値を集計条件に含めてください。

DECODE(購入者, NULL, 主キー)
見たいな感じで。

そうすれば、購入者がNULLのレコードはDECODEの結果が主キーに、購入者がNULLでなければNULLになるので
お望みの結果が得られるかと。

一意に特定できるような項目がないのであれば、不可能かと。シーケンスとか使えばできないことはないかもしれませんが。

投稿日時 - 2004-06-21 13:51:28

お礼

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

自分の周囲の人に聞いても良い案がなかったので、
正直あきらめ半分で質問させていただいたのですが、
たくさんの回答をいただいたので、うれしいです。

今回は、集計条件に主キーを含めるというアイディアを使わせていただきます。
NO5の方のアイディアと合わせて、
group by 品名, 購入者, nvl(購入者, 主キー)
という感じにしました。

仕事で必要だったため、とても助かりました。
ありがとうございました。

投稿日時 - 2004-06-23 12:36:54

あなたにオススメの質問