公開日

[MySQL]日付が歯抜けのデータを結合して日付毎に整理されたテーブルを作る

(image)[MySQL]日付が歯抜けのデータを結合して日付毎に整理されたテーブルを作る
目次

やりたいこと

下記の日付が歯抜けになっている2つのテーブル(テーブル1, テーブル2)のデータを日付毎に整理してテーブル3のようなデータを生成したい。

テーブル1

日付商品販売数
2018-01-0210
2018-01-048
2018-01-053
2018-01-074
2018-01-085
2018-01-101

テーブル2

日付商品入荷数
2018-01-0320
2018-01-0530
2018-01-1010

テーブル3

日付商品入荷数商品販売数
2018-01-0100
2018-01-02010
2018-01-03200
2018-01-0408
2018-01-05303
2018-01-0600
2018-01-0704
2018-01-0805
2018-01-0900
2018-01-10101

前提環境

  • MySQL 5.7

方法

以前紹介した連番の仮想表を作るテクニックを駆使すればやりたいことが実現可能です。

MySQLで連番の仮想表を作る

日付だけのテーブルを作る

対象期間、つまり2018年1月1日〜2018年1月10日までのデータを生成します。

SELECT '2018-01-01' + INTERVAL seq_no DAY AS date
FROM (SELECT @seq_no := 0 AS seq_no
      UNION
      SELECT @seq_no := @seq_no + 1 AS seq_no FROM information_schema.COLUMNS
      LIMIT 10) tmp;
date
2018-01-01
2018-01-02
2018-01-03
2018-01-04
2018-01-05
2018-01-06
2018-01-07
2018-01-08
2018-01-09
2018-01-10

日付テーブルにデータをJOINする

上記の日付テーブルに実データをJOINしてやればうまくデータが生成できます。

SELECT
    date_table.date AS '日付',
    IFNULL(table2.商品入荷数, 0) AS '入荷数',
    IFNULL(table1.商品販売数, 0) AS '販売数'
FROM (SELECT '2018-01-01' + INTERVAL seq_no DAY AS date
      FROM (SELECT @seq_no := 0 AS seq_no
            UNION
            SELECT @seq_no := @seq_no + 1 AS seq_no FROM information_schema.COLUMNS
            LIMIT 10) tmp) date_table
LEFT JOIN table1 ON table1.日付 = date_table.date
LEFT JOIN table2 ON table2.日付 = date_table.date

これで無事、得たかったデータを得ることができました。

日付入荷数販売数
2018-01-0100
2018-01-02010
2018-01-03200
2018-01-0408
2018-01-05303
2018-01-0600
2018-01-0704
2018-01-0805
2018-01-0900
2018-01-10101

利用シーン

日付毎にデータをグラフにプロットして可視化したいときにこのテクニックを使うと便利。