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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

SQL

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

Q&A

解決済

2回答

8785閲覧

【MySQL】countで0件のデータも含めて表示したい

Sakamotos

総合スコア7

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

SQL

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

0グッド

0クリップ

投稿2021/05/21 15:12

前提・実現したいこと

MySQLでcount0件のデータも含めて表示したい。

テストの問題番号とそれに紐付く点数を表示したanswersテーブルがあります。

idquestion_idscore
119
219
3110
431
531
635
716
838
922

sql

1select question_id,count(*) 2from answers 3where score in (9,10) 4group by question_id;

scoreが9点以上のquestion_idとそのscoreを集計し、scoreが9点以上に該当しないquestion_idには明示的に0またはNULLを表示したい

実現したいSQL結果

question_idcount(*)
128
20 or NULL
30 or NULL

発生している問題・エラーメッセージ

しかし、実際にはこのSQLの結果が下記のようになってしまいます。

question_idcount(*)
128

色々と調べてみましたが、解決に至るようなヒントが得られなかったため、
countが0の時も表示されるようにするSQLをお分かりの方がおりましたらご教授いただけたら幸いです。

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

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

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

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

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

guest

回答2

0

ベストアンサー

scoreは集計なんですから、count()ではなくsum()です。
出したい結果は9点以上でないとscoreなしという事なので、caseでそのような条件のものをsum()します。

SQL

1select question_id, sum(case when score>=9 then score end) 2from answers 3group by question_id

投稿2021/05/21 15:56

編集2021/05/21 15:57
sazi

総合スコア25195

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

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

Sakamotos

2021/05/22 03:17

ご回答ありがとうございます。こちらのSQL文で実現できました。 こんなに簡単なSQL文で実現できるのはびっくりしました。今後case文も使いこなせるようにしたいと思います。
guest

0

scoreが9点以上の場合はそのままscoreの値、そうでない場合は0とするカラムを返すサブクエリを作り、それをquestion_idごとにsum()関数で集計するクエリを作れば良いです。
case文を使用します。case文はとても便利で、様々な応用が効きます。

mysql8.0以上限定

sql

1with q1 as ( 2 select 3 id 4 ,question_id 5 ,case when score >= 9 then score else 0 end as target -- ここが重要 6 from answers 7) 8select 9 question_id, 10 sum(target) as cnt 11from q1 12group by question_id 13order by question_id;

それ以前のバージョンはwith句が使えないのでサブクエリにする。

sql

1select 2 question_id, 3 sum(target) as cnt 4from ( 5 select 6 id 7 ,question_id 8 ,case when score >= 9 then score else 0 end as target 9 from answers 10) as q1 11group by question_id 12order by question_id;

投稿2021/05/21 15:46

編集2021/05/21 15:50
hope_mucci

総合スコア4447

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

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

Sakamotos

2021/05/22 03:15

ご回答ありがとうございます。こちらのSQL文で実現できました。 with句、case文でこのように柔軟に対応できるのは勉強になりました。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問