- ベストアンサー
OraclのSQL文について(No2)
前回の質問の続きとなります。 Oracl の SQL文について、教えて下さい。 [A]テーブルに [CODE] と [NAME]フィールドがあるとします。 内容は、 A-1 NAME-1 A-2 NAME-2 A-3 NAME-3 と、します。 [B]テーブルに [CODE] と [NOUKI] と [KIN] フィールドがあるとします。 内容は、 A-1 2005/01/01 100 A-1 2005/01/02 200 A-2 2005/01/01 300 A-2 2005/01/10 400 A-2 2005/12/10 500 と、します。 結果が、 A-1 NAME-1 300 A-2 NAME-2 1200 と、なる様にする為には、どういうSQL文を書けば良いのでしょうか ? SELECT A.CODE, A.NAME, B.KIN FROM A, B WHERE A.CODE = B.CODE ORDER BY A.CODE と、すると A-1 NAME-1 100 A-1 NAME-1 200 A-2 NAME-2 300 A-2 NAME-2 400 A-2 NAME-2 500 と、言う結果がでます。(当然ですが) しかし、 SELECT A.CODE, A.NAME, A2.KIN FROM A, A2 WHERE A.CODE = A2.CODE GROUP BY A.CODE,A.NAME ORDER BY A.CODE と、すると[GROUP BYの式ではありません]と、エラーになってしまいます。 (SUM文以前の問題でした) よろしくお願い致します。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
グループ関数を使ってSQLを発行している様ですが、 SELECT部分でBテーブルの「KIN」フィールドに集計がかかっていません。 以下で目的のレコードを抽出できませんか? ------------------------------------------------- SELECT A.CD, A.NAME, SUM(B.KIN) FROM A, B WHERE A.CODE = B.CODE GROUP BY A.CD, A.NAME ORDER BY A.CODE
その他の回答 (2)
- kj_
- ベストアンサー率39% (9/23)
group by 式を使う場合は、取得する項目をすべて書きます。(グループ関数を除く) ※集計したい単位を書きます。 SELECT A.CODE,A.NAME,sum(B.KIN) FROM A,B WHERE A.CODE = B.CODE GROUP BY A.CODE,A.NAME; なぜかというと、 A.CODEとA.NAMEをGROUP(中身が同一な物)のB.KIN をSUM(集計)しなさいと言う命令になるからです。 A.CODE A.NAME B.KIN -------------------------------- A-1 NAME-1 100 (1) A-1 NAME-1 200 (1) A-2 NAME-2 300 (2) A-2 NAME-2 400 (2) A-2 NAME-2 500 (2) ************** ************** SELECT A.CODE,A.NAME,sum(B.KIN) --↑欲しい情報は? FROM A,B --↑どこから? WHERE A.CODE = B.CODE --↑どの条件で? GROUP BY A.CODE,A.NAME --↑集計単位は? ※欲しい情報のすべてがグループ条件に なる様に記述 ; ご参考までに・・・
お礼
ご回答をありがとうございました。 参考になりました。今後とも、宜しくお願い致します。
- surf-takashi
- ベストアンサー率81% (9/11)
私の方でソース間違えてましたね。 一部A.CODEとしなければいけないところを A.CDとしていました。 訂正します。 ---------------------------------------------- SELECT A.CODE, A.NAME, SUM(B.KIN) FROM A, B WHERE A.CODE = B.CODE GROUP BY A.CODE, A.NAME ORDER BY A.CODE
お礼
何度も、恐縮です。 ご指導通りで、結果はでました。こちらの質問のミスですが、 結果が、 A-1 NAME-1 300 A-2 NAME-2 1200 A-3 NAME-3 0(またはnull) には、出来ないのでしょうか? さらに、 >GROUP BY A.CODE, A.NAME これは、要するにSELECT をした項目全てが、必要なのでしょうか ? [GROUP BY A.CODE] のみで、なんとかならないのでしょうか ? よろしくお願い致します。
補足
成功しました。ありがとうございます。 ただ、1つ疑問なのですが、 >GROUP BY A.CODE, A.NAME と、ありますが、これを [GROUP BY A.CODE]にするとエラーになって しまいます。 実際のプログラミングで、このGROUPを書かなければ ならないかと思うとゾッとます。(^^;