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

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回答

632閲覧

以下の2つのSQLについて、同じ結果にならないのですが、なぜでしょうか?

terachapple

総合スコア12

PostgreSQL

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

SQL

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

0グッド

1クリップ

投稿2023/04/10 13:35

実現したいこと

以下のようなテーブルがあり、
「クラスの75%以上の生徒が80点以上のクラス」を取得するという問題があります。
正解のSQLは、Bクラスのみが取得できるようになります。

この問題について、一度自分で考えてみたSQLでは結果が取得できませんでした。
ただ、どうしてもなぜ結果が取得できないのかわからないため、どなたかご教授お願い致します。
イメージ説明

まず、正解のSQLは以下のようなものでこれでBクラスのみが取得できます。

select class
from testresults
group by class
having 0.75 * count(*) <= sum(case when score >= 80 then 1 else 0 end)

一方で私が考えた以下のSQLでは「0 rows affected」となり、1件も取得できませんでした。

select class
from testresults
group by class
having 0.75 <= sum(case when score >= 80 then 1 else 0 end) / count(*)

2つのSQLで違うところはhaving句の中でcount(*)が
左辺にあるか、右辺にあるかだけです。
そのため、同じ結果(Bクラスが取得できる)になると思っているのですが、
同じ結果になりません。何故だかわかる方ご教授お願い致します。

試したこと

演算子の優先順位について調べてみたのですが、掛け算割り算のほうが
不等号よりも優先して処理されるので、やはり同じ結果になるのではと思っただけでした。

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

使用しているデータベースは「PostgreSQL13」です。

ご不明点がありましたら、ご指摘ください。

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

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

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

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

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

guest

回答1

0

ベストアンサー

演算子 「/」 の仕様は、「商(整数の割り算では余りを切り捨て)」です。
算術関数と演算子

sum(case when score >= 80 then 1 else 0 end) / count(*)

上記の割り算の左辺は、1か0の合計なので、整数です。
右辺も、当然、整数です。
結果、整数の割り算、となり、余りは切り捨て、になるので、計算結果は、0か1になります。
1になるのは、全員が80以上の場合のみなので、ABC全てのクラスで、0となり、条件を満たしません。

投稿2023/04/10 14:02

編集2023/04/10 14:05
YT0014

総合スコア1708

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

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

terachapple

2023/04/10 23:02

ご回答ありがとうございます。 演算子 「/」 の仕様は、「商(整数の割り算では余りを切り捨て)」です。 これがすっかり抜け落ちてしまっていました。 普通の割り算をしてくれて小数点以下まで 商を出してくれるものだと思い込んでいました。 すっきりしました。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問