SQLで平均値を求める際に0とnullを除外したい方法

このQ&Aのポイント
  • SQLで平均値を求める際に0とnullの値を除外する方法について教えてください。
  • 具体的には、複数のフィールドの平均値を求める際に、0とnullを除外した計算方法を知りたいです。
  • Oracle10の環境で使用する方法を教えていただけると助かります。
回答を見る
  • ベストアンサー

group by  0とnull値は、平均値の計算から省きたい

行ないたいこと group by avgのSQLで、0とnull値は、平均値の計算から省きたい 各フィールドの平均値を出力したいのですが、 0とnullの値は、平均値の計算から省いて計算する必要があります。 (分母にカウントしません) 平均値を求めるフィールドが、1つだけなら、条件式を作成することが出来たのですが、同時に3つのフィールドの計算を求める必要があります。 環境:oracle10 -table hoge 日付, a , b, c 5/4 200,null,50 5/5 200,100,0 5/6 200,null,100 期待する値(各フィールドの平均値、だたし0とnullは分母から除外) a = (200+200+200)/3 = 200 b = 100/1 = 100 c = (50+100)/2 = 75 質問1. このようなSQLは実現可能でしょうか? 質問2. 実現可能であれば、ご教示いただきたいのですが… よろしくお願いいたします。

  • Oracle
  • 回答数2
  • ありがとう数1

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

  • ベストアンサー
  • root139
  • ベストアンサー率60% (488/809)
回答No.2

No.1です。 AVG関数を使えばもっと簡単にできました。 例) ----------------------------------------------------------------- SELECT AVG(CASE WHEN a = 0 THEN NULL ELSE a END), AVG(CASE WHEN b = 0 THEN NULL ELSE b END), AVG(CASE WHEN c = 0 THEN NULL ELSE c END) FROM avg_sample; ---------------------------------------------------------------------

namida6000
質問者

お礼

回答ありがとうございます。(お礼はこちらだけに記述します。) いくつもの解決方法を教えてくださり感謝しています。 無事解決できそうです。 関数内で条件が書けるなんて、自分の勉強不足を痛感しました。 本当にありがとうございました。

その他の回答 (1)

  • root139
  • ベストアンサー率60% (488/809)
回答No.1

Oracleでは、確認してませんが、CASE式を使えば出来るかと。 例) ----------------------------------------------------------------- SELECT SUM(a) / COUNT(CASE WHEN a = 0 THEN NULL ELSE a END), SUM(b) / COUNT(CASE WHEN b = 0 THEN NULL ELSE b END), SUM(c) / COUNT(CASE WHEN c = 0 THEN NULL ELSE c END) FROM hoge; ---------------------------------------------------------------------

参考URL:
http://www.geocities.jp/mickindex/database/db_case.html

関連するQ&A

  • Access SQLでnull値のOrderby

    お世話になります、 AccessのSQLについて教えてください。 例えば打率をSQLの中で計算させたとします。その値で Order by して表示させたいのですが、計算結果がnull (打席が0の人)は分母が0になってしまい値が存在しない (null)ですよね、その場合にOrder byを行うとSQLでエラーになってしまいます。 このような場合皆様ならどのように回避されるでしょうか? select B.daritu From (select hit/dasu As daritu From A ) As B Order by B.daritu

  • order by について

    質問させてください。 下記テーブルがあるとします。 [samle_tbl](フィールドa, b(integer)) ====== a|b ====== 2|* *|4 3|5 4|2 *|1 2|6 1|2 (※*はNULLデータ) 上記のテーブルでa, bフィールドにおいて数字の大きいレコード順に取得したいとかんがえています。 2|6 3|5 *|4 4|2 2|* 1|2 *|1 簡単にいうとa, bフィールドの値においてどちらかの数値がa, bフィールド内において降順にレコードをシュとくしたいです。 同じ順番に値する場合*(NULLデータ)を含むレコードと含まないレコードの順番は気にしません。 どのようなSQLを実行すれば取得できますでしょうか?

  • Accessで値がnullの場合は計算せずにnullをかえす方法

    Accessについて、教えてください。 クエリで抽出しているときに、フィールド1とフィールド2の数値を掛け算した値をフィールド3に表示したいと思っています。(小数点1位まで表示) フィールド1とフィールド2は値がnullの場合もありますが、この場合は「0」として扱うのではなく、そのまま計算結果もnullにしたいと思っています。 最初は単純に フィールド3: ROUNDMS2(ROUNDMS([フィールド1],1)*ROUNDMS([フィールド2],1),1) とクエリに表記したのですが、この場合「フィールド1」や「フィールド2」がnullの場合は#ERRORが表示されました。 次に、IFでフィールド1やフィールド2がnullの場合は計算せずにnullをかえしてもらおうと下記のような文をつくりました。 フィールド3: IIf([フィールド1]=Null,Null,IIf([フィールド2]=Null,Null,ROUNDMS2(ROUNDMS([フィールド1],1)*ROUNDMS([フィールド2],1),1))) これでもやっぱり#ERRORが表示されます。 いろいろと検索したのですが、nullを0として扱う例は多数見つけられましたがnullのまま扱う例が見つけられませんでした。 勘違いしているところがあるかもしれませんが、アドバイスよろしくお願いいたします。

  • null→数値にするには?

    何度も質問してすみません。 NULLが格納されているフィールドに 「0」や「1」といった値を入れる為には どういうINSERT INTO文をPHP内で記述すれば宜しいでしょうか? pg_field_is_nullを使ってみたのですが イマイチ値を変更する事ができません。 また、SQL文で「NOT NULL制約」という言葉があるのを知ったのですが、 ALTER TABLE文でテーブルを作る時に、 各フィールドにはnullではなく、「0」を最初から格納したい場合は どういった記述をすれば宜しいでしょうか? 宜しくお願い致します。

  • 平均値のもとめ方

    日数の平均を取得したいのですが、小数点の値が戻ってきません。どうしてでしょうか? select avg(datediff(y,A_date,B_date)) from TABLE ●欲しいデータ 1.5 = 3(日間) ÷ 2(レコード) ●データ内容 SQL> select A_date,B_date from TABLE; A_date,B_date ---------- 2005/07/01 2005/07/02 2005/07/01 2005/07/03

  • NULL値を含む場合のフィルタ

    アクセスです。 テーブルに フィールド1 フィールド2 A    B       B  C       C と入ってるとします。 フィールド2についてはNULL値のレコードもあれば、 値が入ってる場合もあります。 このテーブルをフォームにひもづけていて、(帳票フォームにしています) フォームヘッダーにテキストボックス2つとコマンドボタンがあり Private Sub コマンド_Click() Me.Form.Filter = _ "フィールド1 like '*" & Me.テキスト_1.Value & "*'" & " and " _ & "フィールド2 like '*" & Me.テキスト_2.Value & "*'" Me.Form.FilterOn = True End Sub としたときに、レコードのフィールド2に文字が入ってる場合は、抽出できるのですが、 フィールド2がNULLの場合は、1件もヒットしません。 テキスト_1にはAを入れて テキスト_2には何も入れないで検索してみると、1件もヒットしませんが、 テキスト_1にBを入れて検索すると、Bのレコードが抽出されます。 もちろん テキスト_1もテキスト_2もBをいれても、Bのレコードが抽出されます。 VBAコードで & "フィールド2 like '*" & Me.テキスト_2.Value & "*'" としてるので、NULL値でも抽出されると思ったのですがなぜ何も抽出されないのでしょうか? ワイルドカードでnull値も検索されないのでしょうか? テーブルのフィールド2のデータをNull値ではなく、””にしたら、問題なく抽出されましたが データのNull値はNull値のままにして、空白などの文字には置き換えたくないです。 (というか、すべてのNULL値に空白を入れる作業が大変なのでやりたくないです。 実際のフィールド数は50個くらいあります) よろしくお願いします。

  • 表中にNULLが含まれる場合の計算について

     データベース内の、ある表において、各社員の一日の自動車走行距離の合計をsumを用いて計算するさいに、NULLが含まれる場合、NULLのところは、0として計算してくれるのでしょうか?  例えば、三人の社員がいて、走行距離のフィールドの値がそれぞれ、5、3、NULLだった場合、sumで合計を出すと、8と正しく表示されるのでしょうか。  以前に、ある数値にNULLをかけても、0にはならず、NULLになるということを聞いていたので、足し算の場合はどうなるのかわからなかったので、質問いたしました。

  • NULLを認識させる方法

    Access2000を使用しています。 SQL文について質問です。 AとBの、内容が似たテーブル (フィールド項目は全く同じで入力内容が若干違います) それぞれの'数量'というフィールドを比べ、 内容が一致する件数を出力したいというのが目的です。 方法としてはCOUNTを使用し、 (A.数量)(B.数量)を結合&比較して一致しないレコードが NULL意外のものを件数に数えるようにしたいのです。 しかしIS NULLやIS NOT NULLを使うとTRUEかFALSEが 渡ってしまいます。 そこで質問なのですが、 COUNTを使って、 データが一致しないところがNULLであることを認識させ、 カウントからはずすには、どのようにSQLを作成したら よいでしょうか?

  • Nullを変更

    t_tanaorosiというテーブルに棚番というフィールドがあります。 値がNullならば"なし"と棚番へ保存したいのですが どうすればいいのでしょうか? 教えてください。 お願いします。 VB6.0 SQL Serverです。

  • SQL ORDER BYにおける条件について

    SQLのORDER BY句について質問です。 項目A,B,Cがあり、  項目AがNULLの場合   → ORDER BY 項目B,項目C  項目AがNULL以外の場合 → ORDER BY 項目A,項目C としたいのですが、どう指定すればいいでしょうか? 色々と調べたところ、CASE文を使用する?のかなと思って いるのですが、具体的には回答を得ていません。 お手数ですが、ご回答宜しくお願い致します。 ※使用DBはOracle10です。