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

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

新規登録して質問してみよう
ただいま回答率
85.35%
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回答

1878閲覧

SQLで商品のアンケート集計をしたい

takumil

総合スコア9

MySQL

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

SQL

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

0グッド

1クリップ

投稿2021/07/28 12:50

商品のアンケートで以下の中から商品の印象を
3つまで答えてもらいデータがカンマ区切りで登録されています。

  1. 安い
  2. 高い
  3. 見た目が良い
  4. また買いたい
  5. うまい
idnameanswer
1商品A1,5
2商品B2,3,4
3商品A5
4商品A1,2,5
5商品B3,4,5
5商品B3
5商品B3

商品ごとにベスト3を集計したい

|id|name|best1|best2|best3|
|:--|:--:|--:|
|1|商品A|5|1|2|
|2|商品B|3|4|2|

いろいろとみなさまに質問させていただき勉強しています。
SQLは奥が深いなと思います。

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

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

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

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

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

m.ts10806

2021/07/28 14:10

テーブル構造変えないと複雑化するばかりでパフォーマンス期待できない駄文になると思いますが、そもそも自身で何かやってみたことはあるのでしょうか。
m.ts10806

2021/07/28 14:10

テーブル定義等提示されないと何とも言えませんし、 ただ、現状だとSQLでなくアプリケーション側で集計したほうがいいとしか。 SQLだけでやりたいなら構造変えるよう強くすすめます。
gentaro

2021/07/28 16:26

> 3つまで答えてもらいデータがカンマ区切りで登録 そもそもこれがSQLにおけるバッドノウハウだという事を知っているのだろうか。
takumil

2021/08/03 19:29

素人でどのようなテーブル構造が良いのか、、、すみません。
m.ts10806

2021/08/03 23:04

「データベース 最適化」で検索
guest

回答2

0

ベストアンサー

SUBSTRING_INDEX()と添え字用のインラインビューを用いで,区切りを縦方向に展開します。
次に、ランキングを求めます。
最後に、group_concat()でスコア順に並べます。

SQL

1select name, group_concat(answer order by score desc) ranking 2from ( 3 select name, answer, count(*) score 4 from ( 5 select name 6 , substring_index(substring_index(answer, ',', n.i), ',', -1) as answer 7 from tbl 8 cross join ( 9 select 1 as i 10 union all select 2 union all select 3 union all select 4 union all select 5 11 ) n 12 ) step1 13 group by name, answer 14) step2 15group by name

投稿2021/07/29 00:55

sazi

総合スコア25327

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

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

takumil

2021/08/12 07:00

回答いただきありがとうございました。
guest

0

まず、商品ごとに、それぞれの選択肢に何票投票されたかを集計するViewを作成します。これでデータの持ち方が正規刑になるので応用が利きやすくなります。

SQL

1CREATE OR REPLACE VIEW Poll(name, answer, total) AS 2 SELECT name, answer, SUM(cnt) 3 FROM ( 4 SELECT name, '1' AS answer, SIGN(INSTR(answer, '1')) AS cnt FROM Survey 5 UNION ALL SELECT name, '2' AS answer, SIGN(INSTR(answer, '2')) AS cnt FROM Survey 6 UNION ALL SELECT name, '3' AS answer, SIGN(INSTR(answer, '3')) AS cnt FROM Survey 7 UNION ALL SELECT name, '4' AS answer, SIGN(INSTR(answer, '4')) AS cnt FROM Survey 8 UNION ALL SELECT name, '5' AS answer, SIGN(INSTR(answer, '5')) AS cnt FROM Survey 9 ) T 10 GROUP BY name, answer;

あとは以下のようなSQLで実現できるかと思います。

SQL

1SELECT 2 name, 3 MAX(CASE WHEN rnk = 0 THEN answer END) best1, 4 MAX(CASE WHEN rnk = 1 THEN answer END) best2, 5 MAX(CASE WHEN rnk = 2 THEN answer END) best3 6FROM ( 7 SELECT 8 name, 9 answer, 10 (SELECT COUNT(*) FROM Poll P2 WHERE P1.name = P2.name AND P1.total < P2.total) AS RNK 11 FROM Poll P1 12) T 13GROUP BY name

投稿2021/07/28 14:21

neko_the_shadow

総合スコア2349

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

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

takumil

2021/08/03 19:28

回答いただきありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問