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

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

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

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

SQL

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

Q&A

解決済

1回答

371閲覧

【PostgreSQL】欠損値の回避

YM-16

総合スコア1

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

SQL

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

1グッド

0クリップ

投稿2024/03/21 08:14

実現したいこと

商品全体の利益率平均を表示したい

前提

PostgreSQLにおいて、欠損値が含まれている場合の対処について、
本来ならCOALESCEなどでNULL回避をすると思うのですが、それ以外で記述されている
クエリを見て、どのような原理なのかわかりません。

該当のソースコード

PostgreSQL SELECT AVG((unit_price * 1.0 - unit_cost) / unit_price) AS unit_profit_rate FROM tbl ;

補足情報(FW/ツールのバージョンなど)

上記のクエリで問題なく動作しており、
AVG((COALESCE(unit_price, 1.0) - unit_cost) / COALESCE(unit_price, 1.0)) AS unit_profit_rate
と記述したのと同じ結果が出力されるのですが、
なぜ1を掛けることで欠損値を回避できているのかわかりません。
初歩的な質問かもしれませんが、お分かりになる方いらっしゃいましたらご教示いただけますと幸いです。

ikedas👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

欠損値というのがNullを指しているなら、Null値は集約対象とはならないからです。
集約関数

avg ( smallint ) → numeric
avg ( integer ) → numeric
avg ( bigint ) → numeric
avg ( numeric ) → numeric
avg ( real ) → double precision
avg ( double precision ) → double precision
avg ( interval ) → interval
すべての非NULL入力値の平均(算術平均)を計算します。

「1を掛ける」ことは関係ありません。
逆に、COALESCE()によってNullを回避した場合は結果が変わるはずです。

AVG((COALESCE(unit_price, 1.0) - unit_cost) / COALESCE(unit_price, 1.0)) AS unit_profit_rate
と記述したのと同じ結果が出力されるのですが、

上記で結果が変わらないなら、unit_costがNullなのではないでしょうか。

投稿2024/03/21 08:39

編集2024/03/21 08:48
sazi

総合スコア25195

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

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

YM-16

2024/03/21 08:54 編集

回答ありがとうございます。 テーブルをよく調べるとNULLではなく、そもそも値が入っていない状態の行が含まれていたようです。 (unit_price,unit_costともにNULLはありませんでした) 1を掛けることは関係ないのであれば、意味のない処理なのでしょうか…
sazi

2024/03/21 14:11 編集

> テーブルをよく調べるとNULLではなく、そもそも値が入っていない状態の行が含まれていたようです。 カラムの値がNullではなくて、行自体が存在しないという事ですか? その場合も外部結合等で集計対象にしているなら値はNullとなり結果は変わりません。 > 1を掛けることは関係ないのであれば、意味のない処理なのでしょうか? 1.0は暗黙の型変換でnumericになります。 演算している他の項目の型が分かりませんが、除算があるので小数点以下の誤差を防ぐ為に、numericによる演算にしたかったのではないでしょうか
YM-16

2024/03/21 23:14

>カラムの値がNullではなくて、行自体が存在しない id,unit_price,unit_cost 値,NONE,NONE このような形でNULLではなくNONEと表示されているカラムがありました。 特に結合などはしておりません。 >1.0は暗黙の型変換でnumericになります。 こちら知りませんでした、ありがとうございます。 NULLについて私がまだ理解しきれていない部分はありますが、1を掛ける部分の意味を教えていただいたのでいったん解決とさせていただきます。 ご教示ありがとうございました。
sazi

2024/03/22 00:06

> このような形でNULLではなくNONEと表示されているカラムがありました。 どのように表示されるかは使用するDBツールによります。 多分、NONE=NULLだと思いますが。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問