• ベストアンサー
  • 暇なときにでも

グループ関数の結果について

以下、SQLコマンドを入力するとレコードが選択されない結果になってしまいます。areaの平均より高いものが出力されるはずなのですが何故でしょうか? / 1 select nation,area 2 from nation 3 group by nation, area 4* having area > avg(area) SQL> / レコードが選択されませんでした。 SQL> desc nation; 名前 NULL? 型 ----------------------------------------- -------- ---------------------------- CODE NOT NULL NUMBER(5) NATION NOT NULL VARCHAR2(28) CAPITAL VARCHAR2(20) AREA NUMBER(22) POPULATION NUMBER(22)

共感・応援の気持ちを伝えよう!

  • 回答数3
  • 閲覧数107
  • ありがとう数1

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

  • ベストアンサー
  • 回答No.3

どうも、集計関数の意味が分かっていないようですね。 結論から言えば、 SELECT empno, sal FROM emp WHERE sal > (SELECT avg(sal) FROM emp); で、できます。 sal で、グループ化して、avgを取れば、sal1つ1つの平均、すなわちその値自身になります。自分自身より、大きいことはありえませんから、答えは空集合です。 不等号を等号にすると、全行が出てきますよ。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

回答ありがとうございます。 やっと意味が分かりました。 グループ化したものの平均をavgなどのを使用して行うということですね。 感謝します。

関連するQ&A

  • グループ関数のエラーについて

    下記SQLを実行するとエラーが返ってきます。 構文は合っていると思うのですが何故でしょうか。 1 select nation 2 from nation 3 group by nation 4* having area > avg(area) SQL> / having area > avg(area) * 行4でエラーが発生しました。: ORA-00979: GROUP BYの式ではありません。 副問合せをするとうまくいきました。 1 select nation 2 from nation 3* where area >(select avg(area) from nation) どちらの方法も同じ考え方だと思うのですが、上のやり方でエラーが出る理由を教えてほしいです。 回答のほどよろしくお願い致します。 SQL> desc nation; 名前 NULL? 型 ----------------------------------------- -------- ---------------------------- CODE NOT NULL NUMBER(5) NATION NOT NULL VARCHAR2(28) CAPITAL VARCHAR2(20) AREA NUMBER(22) POPULATION NUMBER(22)

  • 副問合せについて

    NATION表とINVENTION表より人口密度(人口/面積)が100以下の国で、発明事項がある国の国コードを表示する。 方法1:主問合せでNATION表を利用する 14件 1 SELECT DISTINCT NATION_CODE FROM INVENTION 2* WHERE 100 >= ANY(SELECT POPULATION / AREA FROM NATION) 方法2:主問合せでINVENTION表を利用する 80件 SELECT CODE FROM NATION WHERE (POPULATION / AREA) <=ANY(SELECT 100 FROM INVENTION) 出力件数が方法1と2で異なるわけですが同じことをしているので(つもり)件数が違う理由が今ひとつわかりません。 よろしくお願いいたします。 SQL> DESCRIBE INVENTION 名前 NULL? 型 ----------------------------------------- -------- ---------------------------- INVENTION NOT NULL VARCHAR2(30) INVENTOR VARCHAR2(30) YEAR NUMBER(4) NATION_CODE NUMBER(4) SQL> DESCRIBE NATION 名前 NULL? 型 ----------------------------------------- -------- ---------------------------- CODE NOT NULL NUMBER(5) NATION NOT NULL VARCHAR2(28) CAPITAL VARCHAR2(20) AREA NUMBER(22) POPULATION NUMBER(22)

  • 副問合せ 続(Oracle SQL)

    問題:NATION表とINVENTION表より人口密度(人口/面積)が100以下の国で、発明事項がある国の国コードを表示する。 方法1:主問合せでNATION表を利用する 方がうまくいきません。 私の考えた下記SQL文では実行結果が80件返ってしまいます。 答えは方法2と同じ5件ですがどこが悪いのでしょうか? 回答のほどよろしくお願い致します。 方法1:主問合せでNATION表を利用する SELECT CODE FROM NATION WHERE (POPULATION / AREA) <=ANY(SELECT 100 FROM INVENTION) SELECT CODE FROM NATION WHERE POPULATION / AREA < 100;(上と同じ意味) INVENTION表の副問合せがうまくできていないので5件出力できない? 方法2:主問合せでINVENTION表を利用する SELECT DISTINCT NATION_CODE FROM INVENTION WHERE NATION_CODE = ANY(SELECT CODE FROM NATION WHERE 100 >= POPULATION / AREA) NATION_CODE ----------- 107 136 142 154 157 各表の構造はこのようになります。 SQL> DESCRIBE INVENTION 名前 NULL? 型 ----------------------------------------- -------- ---------------------------- INVENTION NOT NULL VARCHAR2(30) INVENTOR VARCHAR2(30) YEAR NUMBER(4) NATION_CODE NUMBER(4) SQL> DESCRIBE NATION 名前 NULL? 型 ----------------------------------------- -------- ---------------------------- CODE NOT NULL NUMBER(5) NATION NOT NULL VARCHAR2(28) CAPITAL VARCHAR2(20) AREA NUMBER(22) POPULATION NUMBER(22)

その他の回答 (2)

  • 回答No.2
  • MZ-80B
  • ベストアンサー率56% (46/81)

やりたいことからみると、GROUP BY と HAVING、WHEREの関係を間違って使用しているようにみえます。 HAVING は GROUP BY でグループ化した行に対しての条件であって、グループ化する前のレコードへの条件と混同した指定になっています。 (GROUP BY を省略した場合には、全体をグループ化したとされます) あと、苦言です。 ここの回答者は親切な方ばかりのようですが、回答が来ないからと言って、微妙にニュアンスが違うだけの質問を立て続けにするのは他の質問している方に心象が非常に悪くなりますので止めた方がよいと思います。 他の質問者=いずれ回答してくれるかもしれない方ということをお忘れなく

共感・感謝の気持ちを伝えよう!

質問者からの補足

回答ありがとうございます。 >HAVING は GROUP BY でグループ化した行に対しての条件であって、グループ>化する前のレコードへの条件と混同した指定になっています。 >(GROUP BY を省略した場合には、全体をグループ化したとされます) この場合、同じ値がないのでグループ化されないはずですが、なぜグループ化する前のレコードとグループ化したあとの条件となるのでしょうか? あと「GROUP BY を省略した場合」とありますがこれを省略してHAVING句を書くことができますか? 基本的にエラーが出ると思うのですが。 回答のほどよろしくお願い致します。

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

areaでグルーピングしてるため、areaが同じ値で集計していることになるのでは。 で、avg(area)=areaでhavingは成立しないのではないかと。 っていうかareaってふつうコード(アジアなら1とか。)で、集計して有意なのか謎ですが。

共感・感謝の気持ちを伝えよう!

質問者からの補足

回答ありがとうございます。確かにareaで同じ値があるとグループ化してしまい、naitonとの数が一致しなくなりますね。 そこでemp表で試してみました。empnoとsalに同じ値はありません。ですがやはり同じ結果に終わってしまいます。 なぜでしょうか? 回答のほどよろしくお願い致します。 SQL> select empno, sal 2 from emp 3 group by empno, sal 4 having sal > avg(sal); レコードが選択されませんでした。 SQL> desc emp; 名前 NULL? 型 ----------------------------------------- -------- ---------------------------- EMPNO NOT NULL NUMBER(4) ENAME VARCHAR2(10) JOB VARCHAR2(9) MGR NUMBER(4) HIREDATE DATE SAL NUMBER(7,2) COMM NUMBER(7,2) DEPTNO NOT NULL NUMBER(2) SQL> select empno, sal from emp; EMPNO SAL ---------- ---------- 7839 5000 7698 2850 7782 2450 7566 2975 7902 300 7369 800 7499 1600 7521 500 7654 1250 7788 3000 7844 1500 7876 1100 7900 950 7934 1300 14行が選択されました。

関連するQ&A

  • エラー「単一グループのグループ関数ではありません」

    エラーをどうやれば修正できるかわかりません。 回答のほどよろしくお願いいたします。 SELECT EMPNO, ENAME, DEPTNO, SAL FROM EMP HAVING AVG(SAL) >ANY (SELECT SAL FROM EMP WHERE HIREDATE LIKE '82%') SQL> DESCRIBE EMP; 名前 NULL? 型 ----------------------------------------- -------- ---------------------------- EMPNO NOT NULL NUMBER(4) ENAME VARCHAR2(10) JOB VARCHAR2(9) MGR NUMBER(4) HIREDATE DATE SAL NUMBER(7,2) COMM NUMBER(7,2) DEPTNO NOT NULL NUMBER(2)

  • グループ関数の問題でエラー!

    下記実行結果により、エラーが出現して困っている次第です。 回答のほどよろしくお願い致します。 SQL> describe emp; 名前 NULL? 型 ------------------------------ EMPNO  NOT NULL NUMBER(4) ENAME      VARCHAR2(10) JOB VARCHAR2(9) MGR NUMBER(4) HIREDATE DATE SAL NUMBER(7,2) COMM NUMBER(7,2) DEPTNO   NOT NULL NUMBER(2) 問1:EMP表より入社年、職種ごとの平均給与を表示しなさい。 平均給与は少数第2位を四捨五入して、$、3桁区切りカンマで表示 SELECT HIREDATE AS 入社年, JOB AS 職種 , TO_CHAR(ROUND(SAL,1),'$9,999') AS 平均給与 FROM EMP GROUP BY HIREDATE,JOB ORA-00979: GROUP BYの式ではありません 問2:上司番号と、その上司の部下の中で給与が最低である従業員の給与を表示しなさい。 上司が存在しない従業員を除き、最低給与が1000ドル以下のグループも除外とし、結果を表示。 SELECT MGR AS 上司番号, MIN(SAL) AS 最低給与, FROM EMP WHERE MGR NOT IS NULL GROUP BY MGR HAVING 1000 < SAL ORA-00936: 式がありません。

  • updateについて

    下記、SQLコマンドを実行するとMERTINの歩合給がSMITHのSALに格納されません。実行後、NULLが入ってしまいます。 ちゃんとemp表のMERTINのCOMMには値が入っているのになぜ実行結果がうまくいかないのでしょうか? 回答のほどよろしくお願い致します。 update w_emp set sal = (select comm from emp where ename = 'MERTIN') where sal < 1000 SQL> select * from w_emp; DEPTNO EMPNO ENAME JOB SAL 20 7902 FORD ANALYST 3000 20 7369 SMITH CLERK 10行が選択されました。 SQL> desc w_emp; 名前 NULL? 型 DEPTNO NOT NULL NUMBER(2) EMPNO NOT NULL NUMBER(4) ENAME VARCHAR2(10) JOB VARCHAR2(9) SAL NUMBER(7,2) SQL> desc emp; 名前 NULL? 型 EMPNO NOT NULL NUMBER(4) ENAME VARCHAR2(10) JOB VARCHAR2(9) MGR NUMBER(4) HIREDATE DATE SAL NUMBER(7,2) COMM NUMBER(7,2) DEPTNO NOT NULL NUMBER(2)

  • エラー2「無効な識別子です」

    ORA-00904: "D"."DEPT": 無効な識別子です。 先ほども似たような質問をしましたが原因がよく分からないなのでご存知の方教えていただければ幸いです。 SELECT D.DEPTNO, E.ENAME, E.SAL FROM EMP E, DEPT D WHERE E.SAL >ANY (SELECT MAX(E.SAL) FROM DEPT D, EMP E GROUP BY D.DEPT) SQL> DESCRIBE EMP; 名前 NULL? 型 ----------------------------------------- -------- ---------------------------- EMPNO NOT NULL NUMBER(4) ENAME VARCHAR2(10) JOB VARCHAR2(9) MGR NUMBER(4) HIREDATE DATE SAL NUMBER(7,2) COMM NUMBER(7,2) DEPTNO NOT NULL NUMBER(2) SQL> DESCRIBE DEPT; 名前 NULL? 型 ----------------------------------------- -------- ---------------------------- DEPTNO NOT NULL NUMBER(2) DNAME VARCHAR2(14) LOC VARCHAR2(13)

  • 自己結合について

    下記SQL文のSELECT句、m.empnoによって左項DEPTNOのMGR値がきちんと出力される理屈がよく分かりません。 回答のほどよろしくお願い致します。 select e.empno, m.empno from emp e join emp m on(e.mgr = m.empno) EMPNO EMPNO ---------- ---------- 7698 7839 7782 7839 7566 7839 7902 7566 7369 7902 7499 7698 7521 7698 7654 7698 7788 7566 7844 7698 7876 7788 7900 7698 7934 7782 13行が選択されました。 SQL> describe emp; 名前 NULL? 型 ------------------------------ EMPNO  NOT NULL NUMBER(4) ENAME      VARCHAR2(10) JOB VARCHAR2(9) MGR NUMBER(4) HIREDATE DATE SAL NUMBER(7,2) COMM NUMBER(7,2) DEPTNO   NOT NULL NUMBER(2)

  • SQL文作成のお願い

    前提として下記のようなテーブルがあります。 テーブル名:test フィールド: 1)id: varchar, not null 2)name: varchar 3)date: timestamp with time zone, not null このテーブルに下記のようなレコードがあります。 '00001', 'A', '2005-01-01 00:00:00' '00001', 'B', '2005-07-01 00:00:00' '00001', 'C', '2005-11-01 00:00:00' '00002', 'X', '2005-01-20 00:00:00' '00002', 'Y', '2005-07-20 00:00:00' '00002', 'Z', '2005-11-20 00:00:00' ■今やりたいこと このテーブルからidごとにdateフィールド値が最近のレコードを取得したい。 ■やってみたこと 下記SQLを発行しました。 >select id, max(date) from test group by id order by id 結果==> 00001 2005-11-01 00:00:00 00002 2005-11-20 00:00:00 実際はnameフィールドの値も取得したいのですが、group by句を使うとフィールド指定ができませんでした。 ■だめだったSQL select id, name, max(date) from test group by id order by id どのようにSQLを書けばよろしいでしょうか?

  • エラー「無効な識別子です」

    ORA-00904: "EMPNO": 無効な識別子です と表示されます。 解決方法知っている方、教えていただければ幸いです。 SELECT EMPNO, ENAME, D.DEPTNO, DNAME FROM DEPT D WHERE EMPNO = (SELECT EMPNO FROM EMP WHERE MGR IS NULL) SQL> DESCRIBE EMP; 名前 NULL? 型 ----------------------------------------- -------- ---------------------------- EMPNO NOT NULL NUMBER(4) ENAME VARCHAR2(10) JOB VARCHAR2(9) MGR NUMBER(4) HIREDATE DATE SAL NUMBER(7,2) COMM NUMBER(7,2) DEPTNO NOT NULL NUMBER(2)

  • 列の桁数変更の方法 (oracle 8i)

    oracle 8.1.7 を使用 下表の列2を下記のように変更したいのですが 方法(SQLplusにて)が分かりません、 ご教示くださいますようよろしくお願いいたします (変更前)列2:T_MIX_PTN VARCHAR2(1) NOT NULL (変更後)列2:T_MIX_PTN VARCHAR2(3) NOT NULL 表 :T_MIX ---------------------------------------- 列1:T_MIX_CD VARCHAR2(4) NOT NULL 列2:T_MIX_PTN VARCHAR2(1) NOT NULL 列3:T_MIX_CNT NUMBER(1,0) NOT NULL 列4:T_MIX_GCD1 VARCHAR2(6) NOT NULL 列5:T_MIX_GRATE1 NUMBER(4,1) NOT NULL 列6:T_MIX_GCD2 VARCHAR2(6) NOT NULL 列7:T_MIX_GRATE2 NUMBER(4,1) NOT NULL

  • かねやんMySQLAdmin1.43

    WinXpでmysqlを勉強中です。 かねやんMySQLAdmin1.43を使って、Sql発行を押し下のように書き込んで実行するとエラーがでます。 CREATE TABLE hotelmember ( hotel_name varchar(40) NOT NULL, com_name varchar(40) NOT NULL, charge_name varchar(40) NOT NULL, id varchar(40) NOT NULL, pass varchar(40) NOT NULL, mail varchar(40) NOT NULL, zip varchar(40) NOT NULL, add varchar(40) NOT NULL, tel varchar(40) NOT NULL, url varchar(40) NOT NULL, memo varchar(40) NOT NULL, PRIMARY KEY ( id ) ) エラー文 You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near 'add varchar(40) NOT NULL,tel varchar(40) NOT NULL, そこで add varchar(40) NOT NULL, tel varchar(40) NOT NULL, url varchar(40) NOT NULL, memo varchar(40) NOT NULL, を削除するとうまくテーブルが作成されます。 なにが悪いんでしょうか?

    • ベストアンサー
    • MySQL
  • Oracle8iのBLOBに画像を登録する方法

    お世話になります。 現在以下のテーブルに画像を取り込むことを行っているのですが、SQL/PLUS等のコマンドで登録する場合どのようなコマンドになるでしょうか? CREATE TABLE Book (No Number(2) NOT NULL, BookName Varchar2(100) NOT NULL, BookAuthor Varchar2(100) NOT NULL, Genre Number(2) NOT NULL, image BLOB, constraint pk_Books primary key(No))TABLESPACE usertsp PCTFREE 5 PCTUSED 90 STORAGE(INITIAL 10k NEXT 1k PCTINCREASE 0 MINEXTENTS 1 MAXEXTENTS UNLIMITED); BLOB型のフィールド(image)に画像を取り込む方法をご存知の方 よろしくお願いします。