2015-11-03 91 views
2

我只是堅持這個問題atm,我不是100%確定如何處理它。在mysql中的計數值缺失

我在那裏我彙總數據上一週

select week(create_date),count(*) 
from user 
where create_date > '2015-02-01' 
and id_customer between 9 and 17 
group by week(create_date); 

說我得到了在計數缺失值結果的表,如下圖所示

5 334 
6 376 
7 394 
8 405 
9 504 
10 569 
11 709 
12 679 
13 802 
14 936 
15 1081 
16 559 
21 1 
24 9 
25 22 
26 1 
32 3 
34 1 
35 1 

例如這裏從16到21有一個明顯的4個值缺失,我希望這些值被包含並計爲0.我想這是因爲我希望這些周與其他指標相匹配,因爲我們將它們輸出到excel文件中進行內部分析。

任何幫助將不勝感激。

回答

1

問題是,sql查詢不能真正產生根本就沒有的數據。

你有3種選擇:

  1. 如果你在你所查詢期間整個表中的每個星期的數據,那麼你可以使用一個自連接得到缺少周:

    select week(t1.create_date), count(t2.id_customer) from customer t1 left join customer t2 on t1.id_customer=t2.id_customer and t1.create_date=t2.create_date and t2.id_customer between 9 and 17 where t1.create_date > '2015-02-01' group by week(t1.create_date)

  2. 如果從客戶表作爲一個整體有缺失周,然後創建一個包含週數從1或0(取決於MySQL的配置),以53的輔助表,做一個左連接到這個輔助表。

  3. 使用循環遍歷原始查詢結果的存儲過程,並使用臨時表在結果集中插入缺失的數據,然後返回擴展數據集作爲結果。

+0

這是一個非常透徹的解釋,從這裏我很直觀,我認爲,因爲有價值缺失,我會繼續前進,並創建幫助表你建議,它應該採取一個方向,然後。再次感謝你,非常感謝。 –

+0

如果第一天失蹤,即第一週恰好爲5,那麼最好的解決方案是什麼,以便從第一週開始? –

+0

我不明白你的問題。第一天從哪裏失蹤?你想從哪裏開始:第1周還是第5周? – Shadow

1

問題是沒有符合您的失蹤周標準的數據。解決方案將從具有全週數字的表中加入。例如,如果你創建一個表weeknumbers包含所有的數字從0到53一個字段weeknumber你可以使用這樣的事情

select weeknumber,count(user.*) 
from weeknumbers left join user on (weeknumbers.weeknumber=week(user.create_date) 
and user.create_date > '2015-02-01' 
and user.id_customer between 9 and 17) 
group by weeknumber; 

Additionaly你可能想限制你不希望看到的週數。 另一種方法是在應用程序中執行此操作。

+0

非常感謝,我有點考慮通過案頭研究的選擇,但我現在有一個更好的方向。 #thumbsup –