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

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

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

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

Q&A

解決済

2回答

371閲覧

くじ引きの当たり/外れ表から、当選率を出力する方法

asakusahammu

総合スコア8

MySQL

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

0グッド

0クリップ

投稿2018/07/19 08:28

前提・実現したいこと

こんにちは。MySQLの初心者です。
MySQLで、くじ引きの当たり/外れ表から、
各ユーザーごとの当選率を出力する方法が分かりません。

試したこと

下記コードより、元データであるくじ引きの当たり/外れ表を出力します。

CREATE TABLE lottery (user_id int, flag int); INSERT INTO lottery (user_id, flag) VALUES (100, 0), (100, 1), (100, 1), (101, 0), (101, 0), (102,1), (103, 1), (103, 0),(103, 1), (103,1);

表が出力されました。flagで、0は外れ、1は当たりを示します。
各ユーザーが引いたくじの回数はバラバラです。

+---------+------+ | user_id | flag | +---------+------+ | 100 | 0 | | 100 | 1 | | 100 | 1 | | 101 | 0 | | 101 | 0 | | 102 | 1 | | 103 | 1 | | 103 | 0 | | 103 | 1 | | 103 | 1 | +---------+------+

最終的に出力したい表(result)は、下記です。


num0: 0(外れ)を引いた回数
num1: 1(当たり)を引いた回数
total: くじ引きを引いた合計回数(num0 + num1)
winning_p: 当選率(num1/(num0 + num1))

上記の表と、コマンド

SELECT user_id, COUNT(flag) AS total FROM lottery GROUP BY user_id;

を実行して、totalまでは出力できました。

+---------+-------+ | user_id | total | +---------+-------+ | 100 | 3 | | 101 | 2 | | 102 | 1 | | 103 | 4 | +---------+-------+

しかし、

・各ユーザーidごとのnum0,num1の出力
・当選率(winning_p)の出力(%表示かつ小数点以下1桁)

のやり方がどうしても分からず、困っております。

詳しい方にご教授いただけましたら、大変助かります。
宜しくお願いします。

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

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

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

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

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

Udomomo

2018/07/19 08:44

MySQLはあくまでDBなので、あまり複雑な計算はSQLではなく、データを取得した後にコード側で行う方が楽だと思います。データから何をどういうロジックで計算するかが変わったときも、その方がすぐ対応できます。
asakusahammu

2018/07/19 09:06

Udomomoさん、ありがとうございます。 DBからデータを取り出した後で、複雑な計算は別コードでした方がベター、という考えは、確かにその通りだと思います。勉強になりました。(本来なら、エクセルでやった方が簡単なのは間違いないです) しかし、今回はSQLの勉強(練習)のため、分からなくなってしまった部分を解決したく、質問させて頂きました。
guest

回答2

0

ベストアンサー

SQL

1select user_id 2,sum(flag=0) as num0 3,sum(flag=1) as num1 4,count(*) as total 5,sum(flag=0)/count(*) as winning_p 6from lottery 7group by user_id

winning_pをどうしてもパーセント表示したいなら

SQL

1select user_id 2,sum(flag=0) as num0 3,sum(flag=1) as num1 4,count(*) as total 5,concat(format(sum(flag=0)/count(*)*100,1),'%') as winning_p 6from lottery 7group by user_id

投稿2018/07/19 09:20

yambejp

総合スコア114572

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

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

asakusahammu

2018/07/21 10:45

ありがとうございました。無事に実行できて、仕組みもわかりました。
guest

0

SQL

1SELECT user_id, 2 COUNT(flag = 0 or null) as num0, 3 COUNT(flag = 1 or null) as num1, 4 COUNT(flag = 0 or 1) as total, 5 CAST(COUNT(flag = 1 or null) * 100 as real) 6 / CAST(COUNT(flag = 0 or 1) as real) as winning_p 7FROM lottery 8GROUP BY user_id;

これで計算できるはず。

SQLite3で確認しました。なお、MySQLでCASTが使えるかどうか知らないのでそれはご自身で調べてください。(SQLITe3だとSELECT内の計算は整数に丸められてしまうため)

投稿2018/07/19 09:11

編集2018/07/19 09:13
PineMatsu

総合スコア3579

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

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

PineMatsu

2018/07/19 09:19

調べたらMySQLでもCAST構文は同じだったので、このSELECT文でできると思います。 COUNT文の条件式は、 http://www.alt-plus.jp/archives/1024 を参考にして下さい。
asakusahammu

2018/07/21 10:45

ありがとうございます。リンクの条件式も勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問