2014-12-29 105 views
1

我試圖通過使用一個輔助表來使用組填補空白,你能幫忙嗎?MYSQL由「間隙」填充組

AUX表由結果從 「訂單」 表

date  quantity 
2014-01-01 7 
2014-01-02 1 
2014-01-04 2 
2014-01-05 3 

期望的結果加入 「訂單」 表「AUX對付天沒有訂單

date  quantity 
2014-01-01 0 
2014-01-02 0 
2014-01-03 0 
2014-01-04 0 
2014-01-05 0 
2014-01-06 0 
2014-01-07 0 

組表「

date  quantity 
2014-01-01 7 
2014-01-02 1 
2014-01-03 0 
2014-01-04 2 
2014-01-05 3 
2014-01-06 0 
2014-01-07 0 
+0

什麼查詢正在按結果生成您的組?如果我正確理解你的問題,我認爲你需要使用'outer join'和這些結果到'aux'表。您的示例數據有點誤導... – sgeddes

+0

我的問題是外部連接..「日期」表已創建爲「輔助表」 – Flavio

+0

是的,外部連接組由輔助表的結果... – Flavio

回答

1

不知道如何創建group by result表,您在outer join中查找的內容,可能是​​3210。事情是這樣的:

select distinct a.date, coalesce(b.quantity,0) quantity 
from aux a 
    left join yourgroupbyresults b on a.date = b.date 

請注意,你可能會或可能不會需要distinct - 取決於你的數據。


編輯,給出你的意見,這應該工作:

select a.date, count(b.date_sent) 
from aux a 
    left join orders b on a.date = date_format(b.date_sent, '%Y-%m-%d') 
group by a.date 
+0

我的組由來自:select date_format(date_sent,'%Y-%m-%d'),從訂單數量(*)作爲數量 – Flavio

+0

@Flavio - 看到這個小提琴:http://sqlfiddle.com/#!2/ 3958ba/1 – sgeddes

+0

非常感謝您的完美工作! – Flavio

1

使用你的結果會是這樣的:

SELECT a.date 
     ,COALESCE(b.quantity,0) as quantity 
FROM auxtable a 
LEFT JOIN groupbyresult b 
    ON a.date = b.date 

你還可以做您的分組在同一查詢作爲左連接:

SELECT a.date 
     ,COALESCE(COUNT(b.somefield),0) as quantity 
FROM auxtable a 
LEFT JOIN table1 b 
    ON a.date = b.date 
GROUP BY a.date 
0

一個熟悉的方法來解決這樣的一個問題是使用具有要返回日期的不同列表行源,然後對有空缺的表進行外連接。這樣,您可以取回所有日期,並且可以用零代替「缺失」的數量值。

例如:

SELECT d.date 
    , IFNULL(SUM(s.quantity),0) AS quantity 
    FROM distinct_list_of_dates d 
    LEFT 
    JOIN information_source s 
    ON s.date = d.date 
GROUP BY d.date 

目前尚不清楚爲什麼GROUP BY會消除一些的日期值。我們可能會猜測,您正在使用ANSI擴展標準的GROUP BY語義的MySQL擴展,並且正在消除行。或者,您可能有一個不包含行的WHERE子句。但我們只是在猜測。


跟進基於在評論OP透露進一步的信息 ...

在上面的查詢,以aux取代distinct_list_of_dates,並與orders取代information_source,並調整連接謂詞帳戶用於日期時間比較

SELECT d.date 
    , IFNULL(SUM(s.quantity),0) AS quantity 
    FROM aux d 
    LEFT 
    JOIN orders s 
    ON s.date >= d.date 
    AND s.date < d.date + INTERVAL 1 DAY 
GROUP BY d.date 
+0

。 。我想你錯過了第一張桌子*有*日期列表。 –

+0

... @GordonLinoff:不可能知道是什麼導致OP觀察到的行爲。我給出的答案是稀疏數據一般問題的一般方法。在OP示例中,distinct_list_of_dates行源確實可以是'aux'表,或者是一個內聯視圖'(SELECT a.date FROM aux a GROUP BY a.date)'。沒有實際的規範,我們只是在猜測。 (如果OP查詢正在執行'GROUP BY some_foo',我們預計結果中可能會丟失一些'日期'值。 – spencer7593

相關問題