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

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

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

MySQL Workbenchは、オープンソースのデータベースモデリングツールです。ビジュアルなデータベース設計・SQL開発・サーバー設定・ユーザー管理・バックアップといった様々な管理ツールを備えます。

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

657閲覧

MySQLである値の総レコード数から、ある値の総レコード数の割合を求めたい

sasakiyo

総合スコア7

MySQL Workbench

MySQL Workbenchは、オープンソースのデータベースモデリングツールです。ビジュアルなデータベース設計・SQL開発・サーバー設定・ユーザー管理・バックアップといった様々な管理ツールを備えます。

MySQL

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

SQL

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

0グッド

0クリップ

投稿2019/08/24 10:20

前提・実現したいこと

プログラミングを勉強していてデータベースを触り始めたのですが
レコードの抽出で試行錯誤しても上手くいかないのでどなたかお教えいただけないでしょうか?

以下の様なテーブルがあり

name | class | gender |
A |1 |男 |
B |2 |男 |
C |2 |女 |
D |2 |男 |
E |2 |男 |
F |1 |女 |
G |3 |男 |

下記のようなレコード抽出結果を求めたいのですがうまくいきません
class | gender | count | per |
1 |女 |1 |50.0% |
2 |男  |3 |75.0%|

ある値の総数をカウントしたのち、さらにその中のある値をカウントし総数で割り表示する
この方法がわかりません。

試したこと

MySQL

1SELECT class,gender,count(*) as count,concat(round(count((gender='男')/gender * 100),1),'%') as per 2FROM student 3WHERE gender='男' 4GROUP BY class

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

MySQLのバージョンは8.0です

よろしくお願いします。

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

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

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

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

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

guest

回答3

0

sql

1SELECT class,gender,count(*) as count, 2concat(round((sum(case gender WHEN '男' THEN 1 ELSE 0 END)/count(*) * 100),1),'%') as per 3FROM student 4WHERE gender='男' 5AND class='1' 6GROUP BY class

投稿2019/08/24 14:52

sasakiyo

総合スコア7

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

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

0

ベストアンサー

集計の単位(group by の項目)より大きいもの(group by の項目が少ないもの)を求めるには別な問い合わせをするしかありません。

SQL

1SELECT class, gender, count(*) as count 2 , count(*) / (select count(*) from student where class=t1.class) as per 3FROM student 4GROUP BY class, gender

上記は相関副問合せでclassの人数を求めています。

レベルを揃えるならクロス集計

SQL

1SELECT class 2 , sum(gender='男') as man_count, , sum(gender='女') as woman_count 3 , sum(gender='男') / count(*) as man_per, sum(gender='女') / count(*) as woman_per 4FROM student 5GROUP BY class

投稿2019/08/24 11:56

編集2019/08/25 04:13
sazi

総合スコア25188

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

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

sasakiyo

2019/08/24 14:47

回答ありがとうございます。 今回は別のアプローチで自己解決ができました コードを書いていただいたのでベストアンサーとさせていただきます。 もしよろしければ自己解決の方でおかしな点がありましたら宜しくお願い致します。
sazi

2019/08/25 04:16

自己解決で正しい結果得られました? where条件でgenderが絞り込まれてるから、駄目だと思いますけど。
guest

0

ストアドプロシージャの基本 の中でテーブルの全体の件数を取得するSELECT結果をDECLAREで定義した変数に保存し、別のSELECTで個々の条件で取得した件数で割合を求めては?

投稿2019/08/24 11:09

Orlofsky

総合スコア16415

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

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

sasakiyo

2019/08/24 14:47

回答ありがとうございます。 リンク先で勉強させていただきます。 もしよろしければ自己解決の方でおかしな点がありましたら宜しくお願い致します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問