2017-10-12 59 views
0

我有一個數據庫,其中有一張表用於保存報告。每個報告都有一個日期(年 - 月 - 日),該日期在報告創建時設置。使用「where」在數據庫中獲取「計數」以設置日期限制

經過大量測試後,我得到了一些工作,但不是我想它的工作。

我想要得到從初始日期(年 - 月 - 日)到最後日期(年 - 月 - 日)每個月的報告數量。但我不太清楚如何完成它。

這是MySQL句話我現在使用:

SELECT meses.month id_mes, count(re_fecha) total 
     FROM 
     (
       SELECT 1 AS MONTH 
        UNION SELECT 2 AS MONTH 
        UNION SELECT 3 AS MONTH 
        UNION SELECT 4 AS MONTH 
        UNION SELECT 5 AS MONTH 
        UNION SELECT 6 AS MONTH 
        UNION SELECT 7 AS MONTH 
        UNION SELECT 8 AS MONTH 
        UNION SELECT 9 AS MONTH 
        UNION SELECT 10 AS MONTH 
        UNION SELECT 11 AS MONTH 
        UNION SELECT 12 AS MONTH 

     ) as meses 

LEFT JOIN reportes ON month(re_fecha) = meses.MONTH 
WHERE re_fecha BETWEEN '2017-01-01' AND '2017-08-31' 
GROUP BY meses.MONTH, monthName(re_fecha) 

這是下面的結果我與MySQL的句子越來越:

id_mes | total 
--------------- 
    04 | 15 
    05 | 5 
    06 | 15 
    07 | 2 

我我不確定這是否有幫助,但如果我不使用「re_fechas ...」的結果,我會得到更接近我們所尋找的結果:

id_mes | total   
-------------   
01  | 0   
02  | 0   
03  | 0   
04  | 15    
05  | 5 
06  | 15 
07  | 2 
08  | 6 
09  | 0 
10  | 0 
11  | 0 
12  | 0 

最後,我想看看:

id_mes  | total    
-------------------  
01-2017  | 0    
02-2017  | 0    
03-2017  | 0    
04-2017  | 15 
05-2017  | 5 
06-2017  | 15 
07-2017  | 2 
08-2017  | 6 

我有兩個問題,它是如何工作現在:

  1. 當我用一句「哪裏「沒有顯示在指定日期有0個報告的月份。如果我不使用「在哪裏」,我幾乎以我想要的方式得到東西,但不在我想要的日期範圍內。

  2. 我遇到的另一個問題是我想獲得當月的年份(如上面所需的代碼塊所示)。

我希望這是足夠的信息來了解一切,我不知道如果我能提供的數據庫,但如果你認爲會有所幫助,讓我知道。

回答

0

你幾乎明白了。

如果您將OR re_fecha IS NULL添加到您的WHERE條款中,那麼您幾乎可以得到您想要的。

我想出了另一種解決方案,可以幫助你:

SELECT meses.aMonth aMonth, COUNT(re_fecha) total 
FROM (
    -- Listing all months in period 
    SELECT DATE_FORMAT(m1, '%m-%Y') aMonth 
    FROM (
    -- Range limit: about 21 years 
    SELECT 
    ('2017-01-01' - INTERVAL DAYOFMONTH('2017-01-01')-1 DAY) +INTERVAL m MONTH as m1 
    FROM (
     SELECT @rownum:[email protected]+1 m FROM 
     (SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4) t1, 
     (SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4) t2, 
     (SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4) t3, 
     (SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4) t4, 
     (SELECT @rownum:=-1) t0) d1 
    ) d2 
    WHERE m1 <= '2017-08-31' 
    ORDER BY m1) meses 
LEFT JOIN reportes ON DATE_FORMAT(re_fecha, '%m-%Y') = meses.aMonth 
WHERE re_fecha BETWEEN '2017-01-01' AND '2017-08-31' 
OR re_fecha IS NULL 
GROUP BY meses.aMonth; 

測試:http://sqlfiddle.com/#!9/d21de6/27

輸出示例:

aMonth total 
01-2017 0 
02-2017 0 
03-2017 0 
04-2017 15 
05-2017 5 
06-2017 0 
07-2017 2 
08-2017 0 

如果您不使用MySQL,那麼你可以使用FULL OUTER JOIN而不是LEFT JOIN

請記住,此解決方案僅限於21年。嘗試只將最初的日期更改爲1970年,並親自查看。
如果需要,請添加更多(SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4) tn,以增加月數。

參考和有用的鏈接:

MySQL monthly Sale of last 12 months including months with no Sale
How to get a list of months between two dates in mysql
How to do a FULL OUTER JOIN in MySQL?

+0

@Strawberry即使這是費力的,它很簡單,如果OP不需要幾個月的可變範圍。雖然我們需要一個'FULL OUTER JOIN',但我們沒有在MySQL上使用它,所以我們需要用'LEFT JOIN'來模擬它。我更新了答案,增加了解決這個問題的另一種方法。 – MiguelKVidal

+0

Gotcha - 我的錯誤。 – Strawberry

+0

這個完美的作品!我們已經嘗試過並且已經實施了,並且正如我們所希望的那樣運行。我很感激答覆。感謝你們。 –

0

在您的查詢中,嘗試將WHERE更改爲AND。

相關問題