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

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

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

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

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

2回答

3260閲覧

Mysql:カラム毎の割合を抽出したい

退会済みユーザー

退会済みユーザー

総合スコア0

MySQL

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

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

1グッド

0クリップ

投稿2018/04/10 06:03

前提・実現したいこと

今回はじめての質問になります。
宜しくお願いします。

phpとMysqlを使用しアンケートを作成しています。
各クエスチョンの「y」の割合を求めたいのですが
上手く抽出することができません。
いい方法があればご教授願います。

File:check
name|q1|q2|q3|q4|
aaaa|y|n|y|y|
bbbb|y|y|n|n|
cccc|n|y|n|y|
aaaa|n|n|n|y|
bbbb|y|n|y|n|
cccc|y|n|n|n|
aaaa|n|n|n|n|
bbbb|n|n|n|n|
cccc|y|y|y|y|
上記の様なデータで
Name毎の各クエスチョンの「y」の割合を出したい
SELECT q1, COUNT()/(SELECT COUNT()
FROM ckeck WHERE name=‘aaaa’) AS q1
FROM check WHERE name = ‘aaaa’ GROUP BY q1

にて名前「aaaa」のq1のyとnの割合を抽出する事は可能ですが、
一気にq1〜q4の「y」の割合を抽出方法はないでしょうか?

例:
aaaa|54%|38%|21%|82%|
この様な感じで抽出

お手数お掛けしますが宜しくお願いします。

退会済みユーザー👍を押しています

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

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

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

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

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

m.ts10806

2018/04/10 06:25 編集

例ですがaaaaは"name"カラムですよね。出力結果に必要でしょうか? →すみません勘違いしました。aaaaさんの割合 が必要と言うことですね。
m.ts10806

2018/04/10 06:20 編集

y,n じゃなく1,0ということであればもう少し簡単なのですけど、データは変えられませんよね?
退会済みユーザー

退会済みユーザー

2018/04/10 06:24

mts10806さん早速の返事ありがとうございます。 nameカラムの出力は必要になります。データformを変更すれば0,1に辺く可能です。
guest

回答2

0

もう少し簡略化できそうな気もしますが、取り敢えずこんな感じでしょうか。

SQL

1select `name` 2 , (q1y/cnt) * 100 as q1y_per 3 , (q2y/cnt) * 100 as q2y_per 4 , (q3y/cnt) * 100 as q3y_per 5 , (q4y/cnt) * 100 as q4y_per 6from ( 7 select `name` 8 , sum(case when q1='y' then 1 else 0 end) as q1y 9 , sum(case when q2='y' then 1 else 0 end) as q2y 10 , sum(case when q3='y' then 1 else 0 end) as q3y 11 , sum(case when q4='y' then 1 else 0 end) as q4y 12 , count(*) as cnt 13 from ckeck 14 group by `name` 15) clc

追記

boolean型を数値として扱って簡略化すると

SQL

1select `name` 2 , (q1y/cnt) * 100 as q1y_per 3 , (q2y/cnt) * 100 as q2y_per 4 , (q3y/cnt) * 100 as q3y_per 5 , (q4y/cnt) * 100 as q4y_per 6from ( 7 select `name` 8 , sum((q1='y')) as q1y 9 , sum((q2='y')) as q2y 10 , sum((q3='y')) as q3y 11 , sum((q4='y')) as q4y 12 , count(*) as cnt 13 from ckeck 14 group by `name` 15) clc

いっそまとめて

SQL

1select `name` 2 , sum((q1='y')) / count(*) * 100 as q1y_per 3 , sum((q2='y')) / count(*) * 100 as q2y_per 4 , sum((q3='y')) / count(*) * 100 as q3y_per 5 , sum((q4='y')) / count(*) * 100 as q4y_per 6from ckeck 7group by `name`

投稿2018/04/10 06:31

編集2018/04/10 07:04
sazi

総合スコア25195

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

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

退会済みユーザー

退会済みユーザー

2018/04/10 06:51

cnt/q1y って逆(q1y/cnt)じゃない?
sazi

2018/04/10 08:56 編集

ですね。 ご指摘ありがとうございます。 修正しました。
退会済みユーザー

退会済みユーザー

2018/04/10 07:08

これ、面白いですね。 参考にさせてもらいます。
sazi

2018/04/10 07:11

VBAなんかでは良く使う手法です。 excelでもSUMPRODUCT()ではわりと定番的。
退会済みユーザー

退会済みユーザー

2018/04/10 07:58

問題なくスムーズに対応できました。 ありがとうございました。
guest

0

ベストアンサー

すでに回答はでているようなのでwith rollupのサンプル

  • 元データ

SQL

1create table `check`(name varchar(20),q1 varchar(10),q2 varchar(10),q3 varchar(10),q4 varchar(10)); 2insert into `check` values 3('aaaa','y','n','y','y'), 4('bbbb','y','y','n','n'), 5('cccc','n','y','n','y'), 6('aaaa','n','n','n','y'), 7('bbbb','y','n','y','n'), 8('cccc','y','n','n','n'), 9('aaaa','n','n','n','n'), 10('bbbb','n','n','n','n'), 11('cccc','y','y','y','y');
  • 上記をname,q1ごとに集計します

SQL

1select name,q1,count(*) as count 2from `check` as t1 group by name,q1 with rollup
  • 比率をだします

SQL

1select name 2,q1 3,count(*) as count 4,if(isnull(q1),1,count(*)/(select count(*) from `check` as t2 where t1.name=t2.name)) as ratio 5from `check` as t1 group by name,q1 with rollup 6 7
  • nameがaaaaでq1=yのデータを抽出

SQL

1select name 2,q1 3,count(*) as count 4,if(isnull(q1),1,count(*)/(select count(*) from `check` as t2 where t1.name=t2.name)) as ratio 5from `check` as t1 group by name,q1 with rollup 6having name='aaaa' and q1='y'

追記

  • なんか変なので書き直し

SQL

1select name,q,yn,count(*) as count 2,count(*)/(select count(*) from `check` as t2 where t1.name=t2.name) as ratio 3 from ( 4select name,'q1' as q,q1 as yn from `check` 5union all select name,'q2',q2 from `check` 6union all select name,'q3',q3 from `check` 7union all select name,'q4',q4 from `check` 8) as t1 9group by name,q,yn
  • 上記集計して

SQL

1select name 2,yn 3,sum((q='q1')* ratio) as q1 4,sum((q='q2')* ratio) as q2 5,sum((q='q3')* ratio) as q3 6,sum((q='q4')* ratio) as q4 7from( 8select name,q,yn,count(*) as count 9,count(*)/(select count(*) from `check` as t2 where t1.name=t2.name) as ratio 10 from ( 11select name,'q1' as q,q1 as yn from `check` 12union all select name,'q2',q2 from `check` 13union all select name,'q3',q3 from `check` 14union all select name,'q4',q4 from `check` 15) as t1 16group by name,q,yn 17) as t3 18group by name,yn
  • havingで条件をつけて抽出

SQL

1select name 2,yn 3,sum((q='q1')* ratio) as q1 4,sum((q='q2')* ratio) as q2 5,sum((q='q3')* ratio) as q3 6,sum((q='q4')* ratio) as q4 7from( 8select name,q,yn,count(*) as count 9,count(*)/(select count(*) from `check` as t2 where t1.name=t2.name) as ratio 10 from ( 11select name,'q1' as q,q1 as yn from `check` 12union all select name,'q2',q2 from `check` 13union all select name,'q3',q3 from `check` 14union all select name,'q4',q4 from `check` 15) as t1 16group by name,q,yn 17) as t3 18group by name,yn 19having name='aaaa' and yn='y' 20

投稿2018/04/10 08:37

編集2018/04/10 09:27
yambejp

総合スコア114839

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問