アプリ版:「スタンプのみでお礼する」機能のリリースについて

テーブルの各区分に応じて、数量を個々に集計するSQLを作成しております。
そして以下のようなSQLを作りました。

SELECT
TBLA.SURYO_1 ,TBLB.SURYO_2 ,
TBLC.SURYO_3 ,TBLD.SURYO_4
FROM
(SELECT SUM(SURYO) AS SURYO_1 FROM TEST_TABLE WHERE TEST_KUBUN = '1' GROUP BY SURYO) TBLA,
(SELECT SUM(SURYO) AS SURYO_2 FROM TEST_TABLE WHERE TEST_KUBUN = '2' GROUP BY SURYO) TBLB,
(SELECT SUM(SURYO) AS SURYO_3 FROM TEST_TABLE WHERE TEST_KUBUN = '3' GROUP BY SURYO) TBLC,
(SELECT SUM(SURYO) AS SURYO_4 FROM TEST_TABLE WHERE TEST_KUBUN = '4' GROUP BY SURYO) TBLD

しかし、この方法ですと、区分'1','2','4'はデータがあるのに対して、区分'3'は
データがないことにより、SQLを実行すると、対象データがないという結果となります。

当然個別にSQLを実行すればよいですが、速度的に4回もSQLを実行するのは効率悪いので、
出来れば一回で行いたいのですけど、区分'3'がデータがなくても、他の3つの区分のデータ
を取得する方法はありますでしょうか?


よろしくお願いします。

A 回答 (3件)

>「GROUP BY SURYO」は年月(YYMM)とするつもりでした。



それでもおかしいんですが・・・
where TEST_KUBUN = '1' and YYMM='0308'
とかならわかりますが。

group byの場合、複数の年月のレコードが存在する場合は、結果は当然ながら集計されて出てきます。
ひとつのselect文(インラインビュー)から複数行が返された場合、結合条件がないこのSQLでは直積が返されます。


で、Oracleということなんで次の方法で出来ます。

1.selectのフィールドにインラインビューを使用する。

SELECT
(SELECT SUM(SURYO) FROM TEST_TABLE WHERE TEST_KUBUN = '1' GROUP BY NENGETSU ) SURYO_1,
(SELECT SUM(SURYO) FROM TEST_TABLE WHERE TEST_KUBUN = '2' GROUP BY NENGETSU ) SURYO_2,
(SELECT SUM(SURYO) FROM TEST_TABLE WHERE TEST_KUBUN = '3' GROUP BY NENGETSU ) SURYO_3,
(SELECT SUM(SURYO) FROM TEST_TABLE WHERE TEST_KUBUN = '4' GROUP BY NENGETSU ) SURYO_4
FROM DUAL;

dual表を使うのがポイントです。
ただし、1つの区分で年月が複数あったら元のSQLと同様、すごいことになりますよ。


2.decodeを使用する。

select
sum(decode(TEST_KUBUN, '1', SURYO, 0)) SURYO_1,
sum(decode(TEST_KUBUN, '2', SURYO, 0)) SURYO_2,
sum(decode(TEST_KUBUN, '3', SURYO, 0)) SURYO_3,
sum(decode(TEST_KUBUN, '4', SURYO, 0)) SURYO_4
from TEST_TABLE
group by YYMM;

これなら、複数の年月があっても正しく表示されます。

効率も、走査が1回だけのこのSQLが一番いいはずです。
SURYOの合計が0のときに0ではなくNULLがいいのであれば、
さらにdecodeで包めばNULLに出来ます。
    • good
    • 0
この回答へのお礼

丁寧な解説ありがとうございました。

まだまだ未熟でして、色々ご迷惑をおかけいたしました
が、無事解決いたしました。本当に助かりました。

とても感謝です。どうもありがとうございました。

お礼日時:2003/08/08 09:49

あと、DBの種類も

    • good
    • 0
この回答へのお礼

失礼しました。手違いでした。。。

「GROUP BY SURYO」は年月(YYMM)とするつもりでした。

>何がしたいんですか?
SELECT SUM(SURYO) AS SURYO_1 FROM TEST_TABLE
WHERE TEST_KUBUN = '1' GROUP BY NENGETSU
と実行すると、

SURYO_1
-------
  50

と言う、結果が得られますが、質問に書かれたSQL文(GROUP BYが間違っていますが・・・)
を実行すると、対象データがないと言う結果になります。

これは「TEST_KUBUN = '3'」に関して、データがない事により、そういう結果になり
ます。
私が求める結果は、以下のような形なんですが、このように出来る事は可能でしょう
か?と言う事でです。

SURYO_1  SURYO_2  SURYO_3  SURYO_4
-------  -------  -------  -------
   50      10             80

見てもらってもわかる(?)と思いますが、SURYO_3のみデータがない為、SURYO_3
は集計された結果が表示されないと言う


ちなみにDBはオラクルです。

重ね重ね失礼しました。

お礼日時:2003/08/07 22:30

そもそも、SQL文あってます?



SURYOがSUM(SURYO)で使われてますし、GROUP BYでも指定されていますし。

何がしたいんですか?
    • good
    • 0

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