34644

[code]

    select
      date,
      value1,
      value2
    from 
        (select 
            t1.date as date,
            t1.value1 as value1,
            t2.value2 as value2
        from
            table1 t1 left join table2 t2 on t1.date = t2.date
        union 
        select 
            t2.date as date,
            t1.value1 as value1,
            t2.value2 as value2
        from
            table1 t1 right join table2 t2 on t1.date = t2.date) t 
    order by date
    
[/code]

・テーブルデータ  
table1 table2  
日付 value1 日付 value2  
1/1 1 1/5 5  
1/2 2 1/6 6  
1/3 3 1/7 7

・SQL実行結果  
date value1 value2  
1/1 1  
1/2 2  
1/3 3  
1/5 5  
1/6 6  
1/7 7

上記SQLですと、1/4の列は両テーブルに存在しないため生成されませんが、下記のように1/4のデータも生成したいです。  
(つまり、最初の日付から最後の日付の間でスキップしている日付データを生成したい)  
date value1 value2  
1/1 1  
1/2 2  
1/3 3  
1/4  
1/5 5  
1/6 6  
1/7 7


CC BY-SA 3.0
2017-05-11T06:46:08.897
34629
2017-05-26T06:26:50.163
2017-05-11T06:54:34.133
7626
7626
question
mysql sql
MySQL:2つのテーブル(table1:日付,値1・table2:日付,値2)を結合した際に、双方に存在しない日付の列を生成したい


連続した日付を生成し、それと外部結合してやれば歯抜けの表を補完できます。  
mysql5.7までには連番を作る便利な方法がないので泥臭くなりますが、例えば次のようにしてやれば生成できます。

[code]

    select date_add(str_to_date('2017/01/01', '%Y/%m/%d'), INTERVAL seq.row day)
    from (
        SELECT @row := @row + 1 as row FROM 
        (select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 6 union all select 7 union all select 8 union all select 9) t,
        (select 1 union all select 2 union all select 3) t2,
        (SELECT @row:=0) t3
    ) seq
    
[/code]


CC BY-SA 3.0
2017-05-11T19:19:16.673
34644
2017-05-12T01:36:12.813
2017-05-12T01:36:12.813
15705
15705
34629
answer


閏年も考慮した日付マスターテーブルを作り、そのマスタに対象となるトランザクションのテーブルを外部結合でつけるのが一番楽なのではないでしょうか？  
また、取り出したいデータの日付レンジの最小と最大の値を、対象となるトランザクションテーブルの最小値と最大値としない場合でも、日付マスターをwhere句で絞るだけなので簡単ですよ。


CC BY-SA 3.0
2017-05-26T06:26:50.163
35033
2017-05-26T06:26:50.163
10937
34629
answer