• ベストアンサー

SQL の 質問

ORACLE の SQLの質問です。 現在 名称  銘柄  単価 甘さ ビタミン りんご  , 1 , 50 , 5 , 5 りんご , 1 , 40 , 4 , 4 りんご , 1 , 30 , 3 , 3 りんご , 2 , 100 , 5 , 5 りんご , 2 , 80 , 4 , 4 りんご , 3 , 50 , 2 , 5 りんご , 3 , 40 , 2 , 4 メロン , 1 , 1000 , 10 , 3 というテーブル 果実 があり、りんごの 銘柄ごとの 平均単価、平均甘さ、平均ビタミンを 出したいんですが、 SELECT AVG(単価) AS 平均単価, AVG(甘さ) AS 平均甘さ, AVG(ビタミン) AS 平均ビタミン FROM 果実 WHERE 銘柄 = (SELECT DISTINCT 銘柄 FROM 果実) AND 名称 = ‘りんご’ ORDER BY 銘柄 というSQLを考えたのですが、どうしても、WHERE 句の後の銘柄のSQLで「式がありません。」のエラーが出てしまいます。できるだけ * ワイルドカードは使いたくないのですが、もし、どなたか、教えていただける方いましたら、ご教授ください。お願いいたします。

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

  • ベストアンサー
  • SUPER-NEO
  • ベストアンサー率38% (706/1857)
回答No.2

集計関数を使うためには、集計をするための条件が必要になります。 それが GROUP BY 句です。この記述がないとエラーになります。 これを前提に SQL をもっとシンプルに見直してみましょう。 すると、#1さんが挙げられたSQL文が導かれるかと思います。 私の場合、これにキー項目の銘柄に関する部分を追加してみました。 SELECT   銘柄,   AVG(単価) AS 平均単価,   AVG(甘さ) AS 平均甘さ,   AVG(ビタミン) AS 平均ビタミン FROM   果実 WHERE   名称 = 'りんご' GROUP BY   銘柄 ORDER BY   銘柄; 質問者さんの SQL 中で、"銘柄=(SELECT ~"という書き方を されていますが、こういう書き方も間違いです。 正しくは、"銘柄 IN (SELECT ~"という書き方になります。 細かな点ではありますが、もう少し SQL について学習されると よりミスの少ない SQL 文が作れると思います。 あと、#1さんへのお礼中で、AS~の記述が余計であるか、 ということが記されていますが、これはまったく関係ありません ただの列名のエイリアス(別名)に過ぎませんので、 これが構文エラーとなることは全角スペースが途中に割り込まない 限りはあり得ません。

niseita
質問者

お礼

お礼、遅れまして、申し訳ありません。 ありがとうございました。 なるほど、まず、AS 以下の記述はエイリアス設定で、つけるか つけないかの違いのみ、(省略可)という事ですね。 原因は 銘柄 = (SELECT ~ の部分にあったのですか。 "銘柄 IN (SELECT ~" の書き方勉強してみます。 GROUP BY について、未だ把握しきれていない部分があるのですが、 選択する項目のGROUP化については、また別途質問をしてみたいと 思います。ありがとうございました。

その他の回答 (1)

  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.1

SELECT 銘柄,AVG(単価) 平均単価, AVG(甘さ) 平均甘さ, AVG(ビタミン) 平均ビタミン FROM 果実 WHERE 名称='りんご' GROUP BY 銘柄; ――とか。試さないで書いてますが。

niseita
質問者

お礼

ありがとうございます。 whereに、銘柄を指定していたのと、asが、余計でしたかね。排除データをGROUP BY の銘柄指定も参考になりました。

関連するQ&A