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

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回答

1422閲覧

複数のテーブルを結合し、さらに指定された期間内の半月ごとの集計を出したい

tommarktravis

総合スコア5

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/12/03 10:54

前提・実現したいこと

お店テーブル、予約テーブル、注文テーブルの3つのテーブルがあります。
以下の3つのテーブルに対して、半月ごとのそれぞれのお店のamountを集計したいです。

お店テーブル

id(bigint(20))shop_name(varchar(50))
1お店A
2お店B
3お店C

予約テーブル

id(bigint(20))created_at(datetime)
12020-10-05 11:25:25
22020-10-20 11:25:25
32020-11-05 11:25:25
42020-11-20 11:25:25

注文テーブル

id(bigint(20))amount(decimal(10,0))予約id(bigint(20))お店id(bigint(20))
110011
225022
335033
450041

例えば2020年10月1日から2020年11月30日までの期間で集計する場合、期待する出力結果としては以下を期待してます。
|dt_from|dt_to|shop_name|total_amount|
|:--|:--|:--|
|2020-10-01|2020-10-15|お店A|100|
|2020-10-01|2020-10-15|お店B|0|
|2020-10-01|2020-10-15|お店C|0|
|2020-10-16|2020-10-31|お店A|0|
|2020-10-16|2020-10-31|お店B|250|
|2020-10-16|2020-10-31|お店C|0|
|2020-11-01|2020-11-15|お店A|0|
|2020-11-01|2020-11-15|お店B|0|
|2020-11-01|2020-11-15|お店C|350|
|2020-11-16|2020-11-30|お店A|500|
|2020-11-16|2020-11-30|お店B|0|
|2020-11-16|2020-11-30|お店C|0|

クエリ

下記を参考にして書きました。
https://ja.stackoverflow.com/questions/21510/%E7%89%B9%E5%AE%9A%E3%81%AE%E6%9C%9F%E9%96%93%E3%81%94%E3%81%A8%E3%81%AB%E9%9B%86%E8%A8%88%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95

sql

1SELECT 2c.dt_from, 3c.dt_to, 4s.shop_name, 5IFNULL(sum(o.amount), 0) AS total_amount 6FROM 7(SELECT 8 @f:='2020-10-01' AS dt_from, 9 DATE_ADD(@f, INTERVAL 14 DAY) AS dt_to 10 UNION ALL 11 SELECT 12 @f:=DATE_ADD(@f, INTERVAL 15 DAY) AS dt_from, 13 DATE_ADD(@f, INTERVAL 14 DAY) AS dt_to 14 FROM 15 reservations 16 WHERE 17 @f < '2020-11-15' 18) AS c -- cはcalendarのc 19LEFT OUTER JOIN reservations r 20ON c.dt_from <= DATE(r.created_at) AND DATE(r.created_at) <= c.dt_to 21LEFT JOIN orders o 22ON o.reservation_id = r.id 23INNER JOIN shops s 24ON r.shop_id = s.id 25GROUP BY c.dt_from, c.dt_to, s.shop_name 26ORDER BY c.dt_from 27

クエリ実行結果

|dt_from|dt_to|shop_name|total_amount|
|:--|:--|:--|
|2020-10-01|2020-10-15|お店A|100|
|2020-10-16|2020-10-31|お店B|250|
|2020-11-01|2020-11-15|お店C|350|
|2020-11-16|2020-11-30|お店A|500|

注文があったときだけしか返ってきません。

ご回答よろしくお願いします。

補足情報

MySQL 5.7.12

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

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

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

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

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

yambejp

2020/12/03 11:32

とりあえずサンプルテーブルをcreate table+insertで書いてください
guest

回答2

0

日付の期間とお店の組み合わせを軸にしていないからだと思います。
shopsとcをcross join したものからreservationsやordersをleft joinする事ですね。

ただリンク先にあるように

MySQLのユーザ変数は評価順序が未定義です。

について、覚悟が必要だと思います。

投稿2020/12/03 12:59

sazi

総合スコア25327

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

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

0

dt_from dt_to 2020-10-01 2020-10-15 2020-10-16 2020-10-31 2020-11-01 2020-11-15 2020-11-16 2020-11-30

のテーブルをあらかじめ作っておくか、プロシージャで作ればよいと思います

投稿2020/12/03 11:31

yambejp

総合スコア116724

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問