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

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

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

COUNT は、広く使用されているSQLの関数です。COUNT関数は、行数、もしくは配列のエンティティの数をカウントします。

MySQL

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

SQL

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

Q&A

解決済

3回答

1471閲覧

SQL COUNT文の条件指定

退会済みユーザー

退会済みユーザー

総合スコア0

COUNT

COUNT は、広く使用されているSQLの関数です。COUNT関数は、行数、もしくは配列のエンティティの数をカウントします。

MySQL

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

SQL

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

0グッド

0クリップ

投稿2020/05/31 04:16

組織メンバーの出身県毎の人数を性別ごとに算出したいと考えています。
以下2つのテーブルを結合して

▼ken(出身県)
|id|name|
|1|北海道 |
|2|青森 |
|3|岩手 |
|4|秋田 |
|5|宮城 |
|6|山形 |
|7|福島 |

▼member(人)
|id|name|ken_id|sex
|1|田中|1|男
|2|太田|2|女
|3|野村|7|男
|4|加藤|1|男
|5|伊藤|3|女
|6|中井|3|男
|7|桜井|3|男
|8|木村|1|女
|9|香取|4|男
|10|青田|3|男

このようにデータがとりたいのですが、
★理想
|ken_id|ken_name|cnt
|1|北海道|2
|2|青森 |0
|3|岩手 |3
|4|秋田 |1
|5|宮城 |0
|6|山形 |0
|7|福島 |1

こう出てしまいます。
★現状
|ken_id|ken_name|cnt
|1|北海道 |2
|3|岩手 |3
|4|秋田 |1
|7|福島 |1

SQL

1SELECT A.ken_id,A.ken_name,COUNT(B.ken_id) AS cnt FROM ken AS A LEFT JOIN member AS B ON A.ken_id=B.ken_id WHERE sex = "男" GROUP by A.ken_id order by A.ken_id

whereで「男」と指定しているので、男の出身がいない青森、宮城、山形がはねられてしまうのだとおもいますが、なんとか「0」なら「0」で表示できないでしょうか。
(今回は例として小さなテーブルで説明していますが、実際はレコードの量が膨大なので、なんとかSQLで処理できると助かります)

以上です。宜しくお願い致します。

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

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

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

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

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

guest

回答3

0

SQL

1SELECT 2 K.ken_id 3 , K.ken_name 4 , COUNT(*) AS cnt 5FROM ken AS K 6LEFT OUTER JOIN member AS M 7ON K.ken_id = M.ken_id 8WHERE M.sex = '男' 9GROUP BY 10 K.ken_id 11 , K.ken_name 12ORDER BY 13 K.ken_id;

投稿2020/05/31 04:50

編集2020/05/31 04:58
Orlofsky

総合スコア16417

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

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

退会済みユーザー

退会済みユーザー

2020/05/31 05:22

「★現状」で書いたのと同じ結果になってしまいました。せっかくご回答頂いたのに申し訳ありません。
Orlofsky

2020/05/31 06:42

SQLで使われるテーブルはCREATE TABLEされている必要があります。質問のテーブル定義の説明もCREATE TABLEに変更。 SELECTされるデータもINSERTされている必要があります。INSERT文で何件かデータを提示してもらえると実際にSQLを実行できるので適切なコメントが付き易いです。 次回の質問から参考にされては?
退会済みユーザー

退会済みユーザー

2020/05/31 07:16

ご指摘ありがとうございます。説明不足な状態で質問してしまい申し訳ありませんでした。またそんな質問にも関わらずご丁寧な回答をありがとうございました。次回より参考にさせて頂きます。
guest

0

JOIN後にWHEREで条件指定して必要な行を削っているためそうなります。

直接memberテーブルをLEFT JOINするのではなく、その部分をサブクエリにして「男のみ」を抽出してからLEFT JOINし、NULLの場合に「0」を出すようにすれば良いです。

投稿2020/05/31 04:29

gentaro

総合スコア8947

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

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

退会済みユーザー

退会済みユーザー

2020/05/31 05:43

ありがとうございます。恥ずかしながらサブクエリというのを知りませんでした。おかげさまでサブクエリを使って希望とおりに算出することができました。もっと勉強します。ありがとうございました。
guest

0

ベストアンサー

SQL

1select t1.id as ken_id, 2t1.name as ken_name, 3(select count(*) from member where 4sex='男' and ken_id=t1.id 5) as cnt 6from ken as t1

もしくは

SQL

1select t1.id as ken_id, 2t1.name as ken_name, 3coalesce(t2.cnt,0) as cnt 4from ken as t1 5left join (select ken_id,count(*) as cnt from member where 6sex='男' 7group by ken_id 8) as t2 9on t1.id=t2.ken_id

投稿2020/05/31 04:56

編集2020/05/31 05:02
yambejp

総合スコア116441

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

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

退会済みユーザー

退会済みユーザー

2020/05/31 05:42

ありがとうございます。希望したとおりに表示することができました。サブクエリの使い方、勉強になりました。お忙しいところありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問