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

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

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

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

Q&A

解決済

3回答

14218閲覧

サブクエリを用いてユーザー数の累積合計を求めたい

hesato

総合スコア13

MySQL

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

0グッド

0クリップ

投稿2017/03/23 03:09

###前提・実現したいこと
MySQLユーザー数の累積合計を求めたいです。

###発生している問題・エラーメッセージ
Table 'database_name.e' doesn't exist

###該当のソースコード

sql

1 2SELECT 3 E.date, 4 E.count, 5 ( 6 SELECT SUM(b.count) FROM E b 7 WHERE b.date <= E.date 8 ) AS total_counts 9FROM 10 ( 11 SELECT 12 DATE(created_at) date, 13 COUNT(*) count 14 FROM 15 users 16 WHERE 17 created_at BETWEEN '2017-03-11' AND curdate() 18 GROUP BY 19 date 20 ORDER BY 21 date ASC 22 ) AS E 23ORDER BY 24 E.date 25

sql

1/* サブクエリ */ 2SELECT 3 DATE(created_at) date, 4 COUNT(*) count 5FROM 6 users 7WHERE 8 created_at BETWEEN '2017-03-11' AND curdate() 9GROUP BY 10 date 11ORDER BY 12 date ASC 13; 14 15/* 16date count 17---------- ----- 182017-03-11 200 192017-03-12 433 202017-03-13 333 212017-03-14 855 222017-03-15 373 232017-03-16 478 242017-03-17 788 252017-03-18 816 262017-03-19 168 272017-03-20 940 282017-03-21 406 292017-03-22 939 30*/

###補足情報(言語/FW/ツール等のバージョンなど)
mysql

よろしくお願いいたします。

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

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

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

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

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

guest

回答3

0

ベストアンサー

sql

1SELECT 2 DATE(created_at) date, 3 COUNT(*) count, 4 (SELECT COUNT(*) FROM users AS F WHERE F.created_at >= '2017-03-11' AND F.created_at < ADDDATE(date, 1)) total_count 5FROM 6 users 7WHERE 8 created_at BETWEEN '2017-03-11' AND NOW() 9GROUP BY 10 date 11ORDER BY 12 date ASC 13;

実行結果

sql

1mysql> SELECT created_at FROM users ORDER BY created_at; 2+---------------------+ 3| created_at | 4+---------------------+ 5| 2017-03-10 23:59:59 | 6| 2017-03-11 14:01:51 | 7| 2017-03-11 14:30:15 | 8| 2017-03-12 09:50:06 | 9| 2017-03-12 13:00:35 | 10| 2017-03-12 16:07:38 | 11| 2017-03-13 13:22:40 | 12| 2017-03-14 07:08:08 | 13| 2017-03-15 09:43:30 | 14| 2017-03-16 07:59:23 | 15| 2017-03-16 11:18:16 | 16| 2017-03-16 22:25:10 | 17| 2017-03-17 21:50:36 | 18| 2017-03-18 04:24:20 | 19| 2017-03-18 11:13:47 | 20| 2017-03-18 18:30:28 | 21| 2017-03-20 02:38:39 | 22| 2017-03-20 17:44:32 | 23| 2017-03-20 22:17:21 | 24| 2017-03-22 03:31:54 | 25| 2017-03-22 20:38:54 | 26| 2017-03-23 00:00:00 | 27| 2017-03-23 00:00:01 | 28+---------------------+ 2923 rows in set (0.00 sec) 30 31mysql> SELECT 32 -> DATE(created_at) date, 33 -> COUNT(*) count, 34 -> (SELECT COUNT(*) FROM users AS F WHERE F.created_at >= '2017-03-11' AND F.created_at < ADDDATE(date, 1)) total_count 35 -> FROM 36 -> users 37 -> WHERE 38 -> created_at BETWEEN '2017-03-11' AND NOW() 39 -> GROUP BY 40 -> date 41 -> ORDER BY 42 -> date ASC 43 -> ; 44+------------+-------+-------------+ 45| date | count | total_count | 46+------------+-------+-------------+ 47| 2017-03-11 | 2 | 2 | 48| 2017-03-12 | 3 | 5 | 49| 2017-03-13 | 1 | 6 | 50| 2017-03-14 | 1 | 7 | 51| 2017-03-15 | 1 | 8 | 52| 2017-03-16 | 3 | 11 | 53| 2017-03-17 | 1 | 12 | 54| 2017-03-18 | 3 | 15 | 55| 2017-03-20 | 3 | 18 | 56| 2017-03-22 | 2 | 20 | 57| 2017-03-23 | 2 | 22 | 58+------------+-------+-------------+ 5911 rows in set (0.00 sec)

ちなみに、ご質問文のサブクエリでは、WHERE句を

sql

1WHERE 2 created_at BETWEEN '2017-03-11' AND curdate()

としておりますが、これを2017年03月23日に実行すると

'2017-03-11 00:00:00' <= created_at <= '2017-03-23 00:00:00'

という意味になり、当日分のデータが正しく取れません。

sql

1mysql> SELECT 2 -> DATE(created_at) date, 3 -> COUNT(*) count, 4 -> (SELECT COUNT(*) FROM users AS F WHERE F.created_at >= '2017-03-11' AND F.created_at < ADDDATE(date, 1)) total_count 5 -> FROM 6 -> users 7 -> WHERE 8 -> created_at BETWEEN '2017-03-11' AND curdate() 9 -> GROUP BY 10 -> date 11 -> ORDER BY 12 -> date ASC 13 -> ; 14+------------+-------+-------------+ 15| date | count | total_count | 16+------------+-------+-------------+ 17| 2017-03-11 | 2 | 2 | 18| 2017-03-12 | 3 | 5 | 19| 2017-03-13 | 1 | 6 | 20| 2017-03-14 | 1 | 7 | 21| 2017-03-15 | 1 | 8 | 22| 2017-03-16 | 3 | 11 | 23| 2017-03-17 | 1 | 12 | 24| 2017-03-18 | 3 | 15 | 25| 2017-03-20 | 3 | 18 | 26| 2017-03-22 | 2 | 20 | 27| 2017-03-23 | 1 | 22 | ※ ここの count の数がおかしい 28+------------+-------+-------------+ 2911 rows in set (0.00 sec)

投稿2017/03/23 04:13

編集2017/03/23 04:22
KiyoshiMotoki

総合スコア4791

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

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

hesato

2017/03/23 05:17

ありがとうございます! 求めているものでございました。 > created_at BETWEEN '2017-03-11' AND NOW() 最後のcountの訂正、気が付きませんでした。 ありがとうございます。
guest

0

レコードのレイアウトとtotal_counts理解ができていませんので想像です。

sql

1SELECT 2 E.date, 3 E.count, 4 ( 5 SELECT count(b.created_at) FROM users b 6 WHERE b.created_at BETWEEN '2017-03-11' and E.date 7 ) AS total_counts 8FROM 9 ( 10 SELECT 11 DATE(created_at) date, 12 COUNT(*) count 13 FROM 14 users 15 WHERE 16 created_at BETWEEN '2017-03-11' AND curdate() 17 GROUP BY 18 date 19 ORDER BY 20 date ASC 21 ) AS E 22ORDER BY 23 E.date

投稿2017/03/23 04:29

編集2017/03/23 04:36
A.Ichi

総合スコア4070

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

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

hesato

2017/03/23 05:20

ありがとうございます。 恥ずかしながら,サブクエリはfromでしか呼び出せないものと思い込んでおりました。 selectでも呼び出せるのですね、勉強になりました。 ありがとうございます!
guest

0

サブクエリをSELECT構文から読んでいるからじゃないですかね?
おもいきってEに当たる部分をviewにしてみてはどうでしょうか?

ちなみにcreated_atはdatetimeですか?
日付をつかったbetweenを取ると思った通りの期間が得られないこともあるので
注意してください

追記

created_atをなぜ日付化しているか仕様がかいていないのでわかりません
かりにcreated_atがdate型だとすると以下

SQL

1select created_at,count(*) as c, 2(select count(*) from users as t2 where created_at BETWEEN '2017-03-11' AND curdate() 3AND t1.created_at>=t2.created_at 4) as t 5from users as t1 6where created_at BETWEEN '2017-03-11' AND curdate() 7group by created_at 8

投稿2017/03/23 03:35

編集2017/03/23 04:11
yambejp

総合スコア114814

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

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

hesato

2017/03/23 03:49

ご回答,と注意事項をありがとうございます。 viewを用いてやってみます!
hesato

2017/03/23 03:53

localでは'create view'を実行できますが、業務用のdatabaseでは権限がないため実行できず,,, 他に方法はあるでしょうか?><
yambejp

2017/03/23 04:14 編集

一応追記しておきました 仕様はちゃんと書いてください もしcreated_atがdatetime型だとして、日付で集計する前提であれば created_date的なカラムをつくっておくことをお勧めします
yambejp

2017/03/23 04:32

さらに言えば、サマリー用のテーブルを作っておくのが吉 日付は遡って更新されることはないでしょうから、 日締め処理で夜中に、前日のデータを集計してサマリーテーブルに 保持しておけば、データが増えても高速に集計結果を得られます
hesato

2017/03/23 05:06 編集

仕様に気をつけます。 ありがとうございます。 > サマリー用のテーブルを作っておく なるほど...ありがとうございます>< 追記 created_at を、 DATE(created_at)にし、datetime型としました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問