2017-02-28 145 views
0

我已经能够选择今年的所有月份,如果它们存在,则为最后一个月。我想要做的是创建一个未来的日期,如果没有任何东西存在,但TotalAmount为0.我可以用PHP填充这个,但我希望MYSQL能有一个更简单的解决方案。MYSQL为现有日期选择总和,为未来日期选择0

SELECT 
DATE_FORMAT(STR_TO_DATE(Invoice.Date, '%m/%e/%Y'), '%m-%Y') AS Date_Month, 
SUM(Invoice.Amount) AS TotalAmount 
FROM Invoice 
WHERE STR_TO_DATE(Invoice.Date, '%m/%e/%Y') BETWEEN DATE_SUB(DATE_ADD(DATE_SUB(CURDATE(), INTERVAL DAYOFYEAR(CURDATE()) DAY), INTERVAL 1 YEAR), INTERVAL 2 YEAR) AND NOW() 
GROUP BY Date_Month 
ORDER BY Date_Month 

电流输出:

01-2016 | 103077 
01-2017 | 104925 
02-2016 | 187065 
02-2017 | 32865 
03-2016 | 135525 
04-2016 | 106500 
05-2016 | 98812 
06-2016 | 111690 
07-2016 | 96193 
08-2016 | 123970 
09-2016 | 126356 
10-2016 | 147454 
11-2016 | 160254 
12-2016 | 98430 

预期输出:

01-2016 | 103077 
01-2017 | 104925 
02-2016 | 187065 
02-2017 | 32865 
03-2016 | 135525 
03-2017 | 0 
04-2016 | 106500 
04-2017 | 0 
05-2016 | 98812 
05-2017 | 0 
06-2016 | 111690 
06-2017 | 0 
07-2016 | 96193 
07-2017 | 0 
08-2016 | 123970 
08-2017 | 0 
09-2016 | 126356 
09-2017 | 0 
10-2016 | 147454 
10-2017 | 0 
11-2016 | 160254 
11-2017 | 0 
12-2016 | 98430 
12-2017 | 0 
+2

你为什么将日期存储为字符串? –

+0

解析出长文本文档 –

+0

将日期存储为日期。 – Strawberry

回答

0

你可以用这样的查询做,但没有进行测试

SELECT 
DATE_FORMAT(STR_TO_DATE(Invoice.Date, '%m/%e/%Y'), '%m-%Y') AS Date_Month, 
SUM(IF(STR_TO_DATE(Invoice.Date > NOW(), 0, Invoice.Amount)) AS TotalAmount 
FROM Invoice 
WHERE STR_TO_DATE(Invoice.Date, '%m/%e/%Y') BETWEEN DATE_SUB(DATE_ADD(DATE_SUB(CURDATE(), INTERVAL DAYOFYEAR(CURDATE()) DAY), INTERVAL 1 YEAR), INTERVAL 2 YEAR) AND NOW() 
GROUP BY Date_Month 
ORDER BY Date_Month;