質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

2回答

872閲覧

Oracle 関数を使用する際の条件について

退会済みユーザー

退会済みユーザー

総合スコア0

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2019/01/15 11:47

##AVG関数の桁数とNUMBER型の桁数が違う場合

前提・実現したいこと

質問を見てくださってありがとうございます。

Oracleを勉強しております。
関数を使用した際の条件について知りたいです。

該当のソースコード

Oracle

1SELECT AVG(salary) 2 FROM employees;

実行結果は以下です。

AVG(SALARY) ----------- 6466.50467

上記の結果を踏まえて、このようなSQL文を作成しました。

Oracle

1SELECT AVG(salary) 2 FROM employees 3HAVING AVG(salary) = 6466.50467;

実行結果は以下です。

レコードが選択されませんでした。

カラム「salary」の型は以下です。

SALARY NUMBER(8,2)

なんとなく、レコード選択が出来ない事が正しいのは分かるのですが、言葉に出来ず困っております。

何故、レコードが選択されないのか教えていただきたいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

既に解決済みのところすいません。
一応質問の内容である「レコードが選択されない」理由について回答したく思います。

まずHAVINGですが、こいつは集約後の集合に対するフィルタとなります。
今回の場合は「6466.50467」という1レコードに対する条件句ですね。
(正確にはSELECTしていないカラムに対する条件も記述できますが)

ですので、これに対して「= 6466.50467」としたのに結果が変化するのはおかしい、
というのは妥当な疑問だと思います。

これは、単に平均した結果が「6466.50467ちょうど」ではなく、「6466.504665以上、6466.504675未満の実数」であるから、
ということになります。

SQLをなんのソフトで、どのような設定で走らせたかにもよりますが、
ある程度以上の桁数は表示上は丸められることが多いです。
しかし、一致条件としては当然丸める前の本来の数値に対して行われるので選択されなかったと言うわけです。

以上です。乱文失礼しました。

投稿2019/01/16 05:13

macof

総合スコア83

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/01/16 08:35

回答ありがとうございます。 解決済みにしてしまったのに、改めて回答してくださって嬉しく思います。 また、おっしゃっている事もとても分かりやすく、納得することが出来ました。ありがとうございます!
guest

0

ベストアンサー

HAVINGではなく、WHEREを使っては?

SQL

1SELECT AVG(salary) 2 FROM employees 3WHERE AVG(salary) = 6466.50467;

追記
考えたら、HAVINGもWHEREも不要ですね。

SQL

1SELECT AVG(salary) 2 FROM employees;

投稿2019/01/15 12:01

編集2019/01/15 12:25
Orlofsky

総合スコア16415

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/01/15 12:04

回答ありがとうございます。 試してみましたが、「ORA-00934: ここではグループ関数は使用できません。」となってしまいます。
Orlofsky

2019/01/15 12:40 編集

回答に追記しました。 全レコードのAVGを求めるから、HAVINGもWHEREもいりません。
退会済みユーザー

退会済みユーザー

2019/01/15 13:28

ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問