2014-09-22 56 views
0

我有以下查詢如何獲得前一年的總金額與明年總

SELECT COUNT(DISTINCT id) AS `total` , YEAR(created_date) AS `memberYear` 
FROM `users` AS `u` 
WHERE (
role_id =2 
AND is_deleted =0 
AND is_trashed =0 
) 
GROUP BY `memberYear` 

與此查詢我得到記錄這樣

total memberYear 
10  2012 
12  2013 
2   2014 

現在我需要得到與上年創紀錄的總和

total memberYear sumTotal 
10  2012  10 
12  2013  22 
2   2014  24 

我如何得到這一筆總數?任何幫助將不勝感激。

+0

計數返回你的用戶爲perticular年的總數...你想達到什麼做... – justrohu 2014-09-22 12:22:18

+0

假設我有計2012年的用戶數爲10,現在2013年的用戶數爲12,因此2013年的總數應該是10 + 12 = 22。我想獲得這種總數 – Nikul 2014-09-22 12:24:08

+0

這可能在一個查詢中完成,但我不知道如何*不在今天早上;我需要第二杯咖啡*。除了我的頭頂,你可以用PHP做它,並做兩個查詢,只需將它們兩個都加起來即可。 '$ total = $ query1 + $ query2;' – 2014-09-22 12:24:42

回答

1

請有這一個嘗試:

SELECT COUNT(DISTINCT id) AS `total` , YEAR(created_date) AS `memberYear`, 
@running_total := @running_total + COUNT(DISTINCT id) AS total 
FROM `users` AS `u` 
, (SELECT @running_total := 0) var_init_subquery 
WHERE (
role_id =2 
AND is_deleted =0 
AND is_trashed =0 
) 
GROUP BY `memberYear` 
+0

哇,謝謝老兄。 – Nikul 2014-09-22 12:29:26

1

如果你使用存儲過程,或者使用嵌套select,你只能用mysql來做,但我不會推薦它。由於您使用PHP,並且已經具有查詢響應,只需將當前年份值添加到前一個:

$sumTotal=0; 
while ($row=mysql_fetch_array($res)){ 
    $sumTotal+=$row["total"]; 
} 
+0

對我來說這似乎很不誠實。 – Azrael 2014-09-22 12:26:12

+0

這對我來說更符合邏輯。爲什麼使用嵌套選擇,當你在結果中已經擁有了所有你需要的? – ovi 2014-09-22 12:29:03

+1

但$ sumTotal和$ previousYearValue ..爲什麼在地球上你會需要兩個,你可以通過只使用$ sumTotal值 – Azrael 2014-09-22 12:31:08

0

您正在尋找累計和。不幸的是,mysql還不支持使這些事情變得很容易的窗口函數。一種方法是使用theta自加入,如:

SELECT X.memberYear, sum(y.total) 
FROM (
    SELECT COUNT(DISTINCT id) AS `total` , YEAR(created_date) AS `memberYear` 
    FROM `users` AS u 
    WHERE role_id =2 
     AND is_deleted =0 
     AND is_trashed =0 
    GROUP BY memberYear 
) AS x 
JOIN (
    SELECT COUNT(DISTINCT id) AS `total` , YEAR(created_date) AS `memberYear` 
    FROM `users` AS `u` 
    WHERE role_id =2 
     AND is_deleted =0 
     AND is_trashed =0 
    GROUP BY `memberYear` 
) y 
    on y.memberyear <= x.memberyear 
group by X.memberYear 

這是未經測試的,所以可能會有一些錯誤。