2013-07-10 70 views
1

我有類似下面列的表格,但約30日期列和500+記錄MySQL的集團由周民瓦特/多個日期列

id | forcast_date | actual_date 
    1  10/01/2013 12/01/2013 
    2  03/01/2013 06/01/2013 
    3  05/01/2013 05/01/2013 
    4  10/01/2013 09/01/2013 

,我需要做的就是讓查詢類似於

week_no | count_forcast | count_actual 
    1    4      6 
    2    5      7 
    3    2      1 

等輸出

我的查詢是

SELECT weekofyear(forcast_date) as week_num, 
     COUNT(forcast_date) AS count_forcast , 
     COUNT(actual_date) AS count_actual 
FROM 
     table 
GROUP BY 
     week_num 

但我所得到的是在每列重複forcast_date計數,即

week_no | count_forcast | count_actual 
    1    4      4 
    2    5      5 
    3    2      2 

任何一個可以請告訴我制定的查詢以獲得我所需要的最佳途徑?

感謝

+0

什麼數據類型是列'forcast_date'和'actual_date'? 'DATE','VARCHAR'還是別的?你想要的輸出「count_forcast」和「count_actual」代表什麼?這些列中的不同值的數量? – Bjoern

+0

您還應該考慮的一點是,即使當週沒有forcast_dates時,您是否想要一排代表一週。按weekofyear(forcast_date)分組,您的結果集僅包含那周至少有一個forcast_date記錄的星期。 – Zec

+0

@Bjoern所有的日期都是DATETIME,count_列是每週在一個星期內落入的次數 – pwatt01

回答

0

萬一別人有同樣的問題走來:

而不是試圖用一些驚人的查詢,我結束了創建date_columns_names的數組,並在程序的循環中被調用這個查詢,對於每個date_column_name,執行asme查詢。它有點慢,但它確實有效

0

嘗試:

SELECT WeekInYear, ForecastCount, ActualCount 
FROM (SELECT A.WeekInYear, A.ForecastCount, B.ActualCount FROM (
    SELECT weekofyear(forecast_date) as WeekInYear, 
    COUNT(forecast_date) as ForecastCount, 0 as ActualCount 
    FROM TableWeeks 
    GROUP BY weekofyear(forecast_date) 
    ) A 
    INNER JOIN 
    (SELECT * FROM  
    (
     SELECT weekofyear(forecast_date) as WeekInYear, 
     0 as ForecastCount, COUNT(actual_date) as ActualCount 
     FROM TableWeeks 
     GROUP BY weekofyear(actual_date) 
    ) ActualTable) B 
    ON A.WeekInYear = B.WeekInYear) 
    AllTable 
    GROUP BY WeekInYear; 

這裏是我的Fiddle Demo

+1

這與OP提供的查詢基本相同,並且會返回類似的結果。問題不在於未聲明的分組字段「week_num」(毫無疑問,OP的ACTUAL查詢使用此別名),這是因爲這兩個計數值是相同的。 – Zec

+0

你也許對@Zec我沒有看到他沒有聲明的暗示的分組別名。 – Edper

+0

啊是的,道歉..我有一個列WEEKOFYEAR(forcast_date)作爲week_num。我編輯了OP,以匹配 – pwatt01

0

嘗試:

SELECT weekofyear(forcast_date) AS week_forcast, 
    COUNT(forcast_date) AS count_forcast, t2.count_actual 
FROM 
    t t1 LEFT JOIN (
SELECT weekofyear(actual_date) AS week_actual, 
    COUNT(forcast_date) AS count_actual 
FROM t 
GROUP BY weekOfYear(actual_date) 
) AS t2 ON weekofyear(forcast_date)=week_actual 
GROUP BY 
weekofyear(forcast_date), t2.count_actual 

sqlFiddle

你必須寫出大約30(你的日期欄)左連接,並且要求是你的第一個日期欄不應該有空的星期(計數爲0)或連接將會錯過。

+0

一個發生在我身上,但因爲我將需要10個以上的列數,所以我希望儘可能避免擁有10個子查詢。如果不可能,那麼我就沒有辦法做到,但我希望有一個更好的方法。此外,上述解決方案僅顯示有預測日期的幾周 – pwatt01

+0

是的,當然,我也有更好的方式感興趣。 – mauretto

+0

@mauretto你可以用t2.count_actual在最後解釋GROUP BY嗎?通過計數而不是日期項來分組似乎很奇怪。該查詢確實對我有效,但是我想知道如果兩週具有相同的count_actual會有什麼問題。 – mikato