2016-08-03 43 views
0

Hello Stack Overflow社區!MySQL查詢 - 超過時間間隔求和

我的MySQL查詢有點問題。我所追求的是一個查詢,它將從表中返回所有Project_Cost的總和,但是我希望它在每個時間範圍內將其分成不同的部分。對我來說,踢球者是我希望他們分裂爲個月(例如:6月,7月,8月等的所有費用)

我現在設置的方式是將它們拆分成一個月份增量,但這是由當前日期決定的。所以基本上這隻能在本月的第一天工作,並且從那時起就不準確了。

有人可以幫我編輯這個查詢,這樣它會給我什麼我後?我一直在測試很多我見過的方法,但沒有什麼能給我以後的東西。

SELECT SUM(IF(DateSigned BETWEEN DATE(DATE_ADD(NOW(), INTERVAL -1 MONTH)) AND NOW(),Project_Cost,0)) AS A, 
    SUM(IF(DateSigned BETWEEN DATE(DATE_ADD(NOW(), INTERVAL -2 MONTH)) AND DATE(DATE_ADD(NOW(), INTERVAL -1 MONTH)),Project_Cost,0)) AS B, 
    SUM(IF(DateSigned BETWEEN DATE(DATE_ADD(NOW(), INTERVAL -3 MONTH)) AND DATE(DATE_ADD(NOW(), INTERVAL -2 MONTH)),Project_Cost,0)) AS C, 
    SUM(IF(DateSigned BETWEEN DATE(DATE_ADD(NOW(), INTERVAL -4 MONTH)) AND DATE(DATE_ADD(NOW(), INTERVAL -3 MONTH)),Project_Cost,0)) AS D, 
    SUM(IF(DateSigned BETWEEN DATE(DATE_ADD(NOW(), INTERVAL -5 MONTH)) AND DATE(DATE_ADD(NOW(), INTERVAL -4 MONTH)),Project_Cost,0)) AS E, 
    SUM(IF(DateSigned BETWEEN DATE(DATE_ADD(NOW(), INTERVAL -6 MONTH)) AND DATE(DATE_ADD(NOW(), INTERVAL -5 MONTH)),Project_Cost,0)) AS F, 
    SUM(IF(DateSigned BETWEEN DATE(DATE_ADD(NOW(), INTERVAL -7 MONTH)) AND DATE(DATE_ADD(NOW(), INTERVAL -6 MONTH)),Project_Cost,0)) AS G 
    FROM project 
    WHERE program = '1'; 
+0

你可能想看看[這裏](https://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html);我認爲'MONTH'(用於分組/範圍替換)和'LAST_DAY'(用於過濾數據)功能可能會有所幫助。 – Uueerdo

+0

在我看來,這種方法是錯誤的,創建一張夏季表並在每月月底有一個cron作業來彙總這些數據會更好嗎?維護要多一點,但性能會比使用簡單好幾個數量級。唯一的問題是如果數據在月份之外改變。這很大程度上取決於您的用例的具體情況,但是將所有這些實時聚合就像運行7或8個查詢必須彙總大塊數據一樣。如果它在某個時候變得靜止,爲什麼要多查詢一次。 – ArtisticPhoenix

+0

這是一個很公平的觀點,我也考慮過這樣做。最終,我決定反對它,因爲我認爲隨後改變這些查詢以提供不同度量標準的自由將超過使所有這些查詢運行的不利因素。此外,項目成本可能會在簽署的月份之外發生變化,這會使其實施起來有點草率。 – Mat

回答

0

你可以使用YEAR(date)*12+MONTH(date)比較個月:

SELECT SUM(IF(YEAR(DateSigned)*12+MONTH(DateSigned) = YEAR(Now())*12+MONTH(Now()),Project_Cost,0)) AS CurrentMonth, 
     SUM(IF(YEAR(DateSigned)*12+MONTH(DateSigned) = YEAR(Now())*12+MONTH(Now())-1,Project_Cost,0)) AS PreviousMonth, 
     SUM(IF(YEAR(DateSigned)*12+MONTH(DateSigned) = YEAR(Now())*12+MONTH(Now())-2,Project_Cost,0)) AS C 
     /* etc... */ 
FROM project 
WHERE program = '1' 
+0

正是我所追求的。非常感謝您的支持。這是按月完美排序。 – Mat

0

可能是我不明白你的問題,但通過似乎組(一年)月

SELECT year(DateSigned), month(DateSigned), sum(Project_Cost) 
from project 
WHERE program = '1' 
Group By year(DateSigned), month(DateSigned) 
+0

這是一個非常好的解決方案,確實爲我提供了我之後的工作。不幸的是不得不運行一個while循環使得這個場景的其餘部分非常混亂。 – Mat