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

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

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

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

SQL

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

Q&A

解決済

1回答

2720閲覧

[MySQL]月ごとのデータ抽出で歯抜けデータに対応したい

entaro12345

総合スコア75

MySQL

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

SQL

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

0グッド

0クリップ

投稿2020/07/09 00:29

前提・実現したいこと

MySQLにてユーザーIDごとの月次集計表を抽出したいです。
単純に抽出ならできるのですが、データがない月もあり、
歯抜け対応に悩んでいる状況です。

#####テーブル構成は下記になります。
[user_data]
|名前|データ型|
|user_id|varchar(10)|
|update_date|datetime|

データ内容例)
|user_id|update_date|
|AAAAA|2020-05-01 10:00:00|
|AAAAA|2020-06-03 10:00:00|
|BBBBB|2020-05-01 10:00:00|
|BBBBB|2020-05-05 10:00:00|
|BBBBB|2020-05-15 10:00:00|
|CCCCC|2020-05-01 10:00:00|

希望抽出内容
|cnt|user_id|u_date|
|1|AAAAA|2020-05|
|1|AAAAA|2020-06|
|3|BBBBB|2020-05|
|0|BBBBB|2020-06|
|1|CCCCC|2020-05|
|0|CCCCC|2020-06|

※わかりづらくて申し訳ございません。

お力を貸してください。
よろしくお願いします。

該当のソースコード

単純な月ごとのデータは下記で抽出できることは確認済みです。

MySQL

1select 2 count(*) as cnt 3 , user_id 4 , date_format(update_date, '%Y-%m') as u_date 5from user_data 6where 1 = 1 7group by user_id, date_format(update_date, '%Y-%m') 8order by user_id, update_date

試したこと

月のデータを作成してjoinしてみましたが、各ユーザーごとの集計にはできませんでした。
(月のデータがuser_idをもっていないので。)

補足情報(FW/ツールのバージョンなど)

MySQL

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

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

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

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

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

guest

回答1

0

ベストアンサー

月のデータを作成してjoinしてみましたが、各ユーザーごとの集計にはできませんでした。
(月のデータがuser_idをもっていないので。)

そのデータを生成しましょう。
直積(cross join)で全ての組み合わせを取得します。

SQL

1select user_id, 日付 2from ( 3 select user_id 4 from user_data 5 group by user_id 6 ) cross join 月のデータ

※user_dataに求めたいuser_idが全て含まれていることが前提です。
他にデータがあるなら(ユーザーのマスタとか)それを使用して下さい。

後は、繋ぐだけですね。

SQL

1select coalesce(arg.cnt, 0) , base.* 2from ( 3 select user_id, 日付 4 from ( 5 select user_id 6 from user_data 7 group by user_id 8 ) usr cross join 月のデータ 9 ) base left join 10 select count(*) as cnt 11 , user_id 12 , date_format(update_date, '%Y-%m') as u_date 13 from user_data 14 where 1 = 1 15 group by user_id, date_format(update_date, '%Y-%m') 16 ) arg 17 on base.user_id=arg.user_id and base.日付=arg.u_date 18order by base.user_id, base.日付

投稿2020/07/09 00:47

編集2020/07/09 00:55
sazi

総合スコア25195

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

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

entaro12345

2020/07/09 01:07

ご回答ありがとうございます。 いただいた内容で抽出することができました! 本当に助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問