- ベストアンサー
複数の副問合わせにて、一つだけデータがない場合の対処法は?
- テーブルの各区分に応じて、数量を個々に集計するSQLを作成しています。しかし、一部の区分にデータがない場合、SQLを実行すると対象データがない結果となります。一回のSQL実行で、データのない区分のデータを取得する方法はありますか?
- テーブルの各区分に応じて、数量を個々に集計するためのSQLを作成しています。しかし、一部の区分にはデータが存在しない場合があります。データのない区分でも他の区分のデータを取得する方法はありますか?
- テーブルの各区分に対し、個別に数量を集計するためのSQLを作成しています。しかし、一部の区分にはデータがないため、SQLを実行すると対象データがない結果となります。一度のSQL実行で、データのない区分でも他の区分のデータを取得する方法はありますか?
- みんなの回答 (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に出来ます。
その他の回答 (2)
- taka_tetsu
- ベストアンサー率65% (1020/1553)
あと、DBの種類も
お礼
失礼しました。手違いでした。。。 「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はオラクルです。 重ね重ね失礼しました。
- taka_tetsu
- ベストアンサー率65% (1020/1553)
そもそも、SQL文あってます? SURYOがSUM(SURYO)で使われてますし、GROUP BYでも指定されていますし。 何がしたいんですか?
お礼
丁寧な解説ありがとうございました。 まだまだ未熟でして、色々ご迷惑をおかけいたしました が、無事解決いたしました。本当に助かりました。 とても感謝です。どうもありがとうございました。