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

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

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

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

Q&A

解決済

2回答

928閲覧

SQL文で困っています。

color

総合スコア90

MySQL

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

0グッド

0クリップ

投稿2016/09/02 10:40

SQL文で以下の事がやりたいです。
まず、table
+------+------------+------------+------------+------------+---------------------+
| id | interview | decision | accept | ng | created_at |
+------+------------+------------+------------+------------+---------------------+
| 5 | 2016-06-09 | 2016-06-10 | 2016-06-11 | 2016-06-12 | 2016-09-02 00:00:00 |
| 5 | 2016-06-09 | 2016-07-10 | 2016-07-11 | 2016-07-12 | 2016-09-02 00:00:00 |
| 5 | 2016-08-09 | 2016-08-10 | 2016-08-11 | 2016-08-12 | 2016-09-02 00:00:00 |
| 5 | 2016-09-09 | 2016-08-10 | 2016-09-11 | 2016-09-12 | 2016-09-02 00:00:00 |
| 5 | 2016-10-09 | 2016-10-10 | 2016-10-11 | 2016-10-12 | 2016-09-02 00:00:00 |
| 5 | 2016-11-09 | 2016-11-10 | 2016-11-11 | 2016-11-12 | 2016-09-02 00:00:00 |
+------+------------+------------+------------+------------+---------------------+

ある期間を月毎にまとめて集計し、各項目の集計もしたいです。
例えば2016-03 - 201612
03は 0、0、0、0が並び、
06は 2、1、1、1が表示する事は
不可能でしょうか。
※カラムの並びは
interview,decision,accept,ng

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

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

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

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

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

guest

回答2

0

既に解決済ですが、
以下のようにケース式とSUM関数の合わせ技ですっきり書けるかも。

ただしデカルト積(直積結合)を利用しているため、
データ量が増えるとパフォーマンス的には不利となるかもしれません。

SQL

1SELECT 2 cal.month 3, SUM(CASE WHEN cal.month = DATE_FORMAT(t.interview,'%Y%m') THEN 1 ELSE 0 END) AS interview_cnt 4, SUM(CASE WHEN cal.month = DATE_FORMAT(t.decision,'%Y%m') THEN 1 ELSE 0 END) AS decision_cnt 5, SUM(CASE WHEN cal.month = DATE_FORMAT(t.accept,'%Y%m') THEN 1 ELSE 0 END) AS accept_cnt 6, SUM(CASE WHEN cal.month = DATE_FORMAT(t.ng,'%Y%m') THEN 1 ELSE 0 END) AS ng_cnt 7FROM 8( 9 SELECT '201603' AS "month" 10 UNION ALL SELECT '201604' 11 UNION ALL SELECT '201605' 12 UNION ALL SELECT '201606' 13 UNION ALL SELECT '201607' 14 UNION ALL SELECT '201608' 15 UNION ALL SELECT '201609' 16 UNION ALL SELECT '201610' 17 UNION ALL SELECT '201611' 18 UNION ALL SELECT '201612' 19 20) cal 21CROSS JOIN tbl t 22GROUP BY 23 cal.month 24ORDER BY 25 cal.month

8月度が漏れてました・・・

投稿2016/09/03 01:34

編集2016/09/03 01:42
Panzer_vor

総合スコア1636

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

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

0

ベストアンサー

ぱっと思いつくのはunionで無理やり

  • 元データ

mysql

1create table tbl (interview date ,decision date ,accept date, ng date); 2insert into tbl values 3('2016-06-09','2016-06-10','2016-06-11','2016-06-12'), 4('2016-06-09','2016-07-10','2016-07-11','2016-07-12'), 5('2016-08-09','2016-08-10','2016-08-11','2016-08-12'), 6('2016-09-09','2016-08-10','2016-09-11','2016-09-12'), 7('2016-10-09','2016-10-10','2016-10-11','2016-10-12'), 8('2016-11-09','2016-11-10','2016-11-11','2016-11-12');
  • 集計

SQL

1select month 2,sum((cap='interview')*c) as c1 3,sum((cap='decision')*c) as c2 4,sum((cap='accept')*c) as c3 5,sum((cap='ng')*c) as c4 6 from 7(select DATE_FORMAT(interview,'%Y%m') as month,'interview' as cap,count(*) as c from tbl group by month 8union select DATE_FORMAT(decision,'%Y%m') as month,'decision',count(*) from tbl group by month 9union select DATE_FORMAT(accept,'%Y%m') as month,'accept',count(*) from tbl group by month 10union select DATE_FORMAT(ng,'%Y%m') as month,'ng',count(*) from tbl group by month 11union select '201603','dummy',0 12union select '201604','dummy',0 13union select '201605','dummy',0 14union select '201606','dummy',0 15union select '201607','dummy',0 16union select '201608','dummy',0 17union select '201609','dummy',0 18union select '201610','dummy',0 19union select '201611','dummy',0 20union select '201612','dummy',0 21) as dummy 22group by month;

なんか効率的な方法がありそうな気がしますが・・・

  • 別案

SQL

1select month 2,sum(c1) as c1 3,sum(c2) as c2 4,sum(c3) as c3 5,sum(c4) as c4 6 from 7(select DATE_FORMAT(interview,'%Y%m') as month,count(*) as c1,0 as c2,0 as c3,0 as c4 from tbl group by month 8union select DATE_FORMAT(decision,'%Y%m') as month,0,count(*),0,0 from tbl group by month 9union select DATE_FORMAT(accept,'%Y%m') as month,0,0,count(*),0 from tbl group by month 10union select DATE_FORMAT(ng,'%Y%m') as month,0,0,0,count(*) from tbl group by month 11union select '201603',0,0,0,0 12union select '201604',0,0,0,0 13union select '201605',0,0,0,0 14union select '201606',0,0,0,0 15union select '201607',0,0,0,0 16union select '201608',0,0,0,0 17union select '201609',0,0,0,0 18union select '201610',0,0,0,0 19union select '201611',0,0,0,0 20union select '201612',0,0,0,0 21) as dummy 22group by month;

投稿2016/09/02 14:25

編集2016/09/02 14:31
yambejp

総合スコア114843

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問