2011-07-06 44 views
1

我的应用程序存储客户完成的付款。在每个月的月底,计算当月支付的总额并提供给所有者:我有一个支付表,其中包含以下字段(最重要)。MySQL在最近12个月内获取付款演变图的查询

ID,datepaid,ENDINGDATE(实际月的截止日期),ammount的,类型,代码,...

现在,有一年支付,我一直要求创建款项的图最近12个月的进化(总计)。

通过阅读等这是我得到的查询,,但我不知道如何获得最新的12个月总计(并获得0,以防未付款完成当月)... 。

SELECT id, endingdate, datepaid, SUM(ammount) AS total 
    FROM `sis_payments` 
    WHERE endingdate >= DATE_SUB(CURDATE() , INTERVAL 1 YEAR) 
    GROUP BY endingdate 

我知道这可能会被严重设计的,但它是我得到了什么...任何线索?谢谢

回答

1

你可以尝试GROUP BY YEAR(endingdate), MONTH(endingdate),或使用DATE_FORMAT等价物。看看Mysql documentation for DATE_FORMAT

此外,不要在SELECT子句中包含日期字段(endingdate,datepaid)。相反,使用YEAR(endingdate), MONTH(endingdate),就像在GROUP BY中一样。

当没有付款的那个月在SQL中稍微复杂一点时得到0。运行查询后,您可以在PHP中处理该问题。

UPDATE

实施例使用DATE_FORMAT:

SELECT 
    DATE_FORMAT(mrendido,'%y-%m') as xyearmonth, 
    SUM(FORMAT(ammountpaid,2)) AS ammtotal 
FROM sis_pyments 
WHERE mrendido >= DATE_SUB(CURDATE(), INTERVAL 1 YEAR) 
GROUP BY xyearmonth 
ORDER BY xyearmonth ASC 
+0

与此查询解决:SELECT DATE_FORMAT(mrendido, '%M')为xmonth,DATE_FORMAT(mrendido, '%Y')作为xyear ,SUM(FORMAT(ammountpaid,2))AS ammtotal FROM sis_pyments \t WHERE mrendido> = DATE_SUB(CURDATE(),间隔1年) GROUP BY xmonth,xyear ORDER BY xyear,xmonth ASC – Enrique

+0

除非需要显示月份和一年分开,您可以使用'DATE_FORMAT'使您的查询更加简洁。我正在用示例更新我的原始答案。 – bfavaretto

+0

哇,没注意到。使用date_format连接月份+年份,并通过此生成的字段进行分组变得更容易。谢谢! – Enrique