- ベストアンサー
グループ関数の結果について
- SQLコマンドを入力するとレコードが選択されない結果になってしまいます。
- areaの平均より高いものが出力されるはずなのですが何故でしょうか?
- レコードが選択されませんでした。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
どうも、集計関数の意味が分かっていないようですね。 結論から言えば、 SELECT empno, sal FROM emp WHERE sal > (SELECT avg(sal) FROM emp); で、できます。 sal で、グループ化して、avgを取れば、sal1つ1つの平均、すなわちその値自身になります。自分自身より、大きいことはありえませんから、答えは空集合です。 不等号を等号にすると、全行が出てきますよ。
その他の回答 (2)
- MZ-80B
- ベストアンサー率56% (46/81)
やりたいことからみると、GROUP BY と HAVING、WHEREの関係を間違って使用しているようにみえます。 HAVING は GROUP BY でグループ化した行に対しての条件であって、グループ化する前のレコードへの条件と混同した指定になっています。 (GROUP BY を省略した場合には、全体をグループ化したとされます) あと、苦言です。 ここの回答者は親切な方ばかりのようですが、回答が来ないからと言って、微妙にニュアンスが違うだけの質問を立て続けにするのは他の質問している方に心象が非常に悪くなりますので止めた方がよいと思います。 他の質問者=いずれ回答してくれるかもしれない方ということをお忘れなく
補足
回答ありがとうございます。 >HAVING は GROUP BY でグループ化した行に対しての条件であって、グループ>化する前のレコードへの条件と混同した指定になっています。 >(GROUP BY を省略した場合には、全体をグループ化したとされます) この場合、同じ値がないのでグループ化されないはずですが、なぜグループ化する前のレコードとグループ化したあとの条件となるのでしょうか? あと「GROUP BY を省略した場合」とありますがこれを省略してHAVING句を書くことができますか? 基本的にエラーが出ると思うのですが。 回答のほどよろしくお願い致します。
- 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行が選択されました。
お礼
回答ありがとうございます。 やっと意味が分かりました。 グループ化したものの平均をavgなどのを使用して行うということですね。 感謝します。