2014-12-22 248 views
3
SELECT DATE_FORMAT(date, "%b") AS month, SUM(total_price) as total 
FROM cart 
WHERE date <= NOW() 
and date >= Date_add(Now(),interval - 12 month) 
GROUP BY DATE_FORMAT(date, "%m-%Y") 

此查询只显示现有月份的结果。我需要所有12个月的销售。MySQL每月销售包括过去12个月的月销售

输出

"month" "total" 
-------------- 
"Jun" "22" 
"Aug" "30" 
"Oct" "19" 
"Nov" "123" 
"Dec" "410" 

所需的输出

"month" "total" 
-------------- 
"Jan" "0" 
"Feb" "0" 
"Mar" "0" 
"Apr" "0" 
"May" "0" 
"Jun" "22" 
"Jul" "0" 
"Aug" "30" 
"Sep" "0" 
"Oct" "19" 
"Nov" "123" 
"Dec" "410" 
+2

您将需要某种辅助日期表,没有销售,以获得几个月改变group by动态日期一部分

where a.Date <= NOW() and a.Date >= Date_add(Now(),interval - 12 month) group by month 

和最后一组。 – davek

+1

我们能做到这一点通过选择“月”为月 UNION SELECT“二月”为月 UNION SELECT“月”为月 UNION SELECT“月”为月 UNION SELECT“五一”为月 UNION SELECT“君”为月 UNION SELECT“七月”为月 UNION SELECT“八月”为月 UNION SELECT“九月”为月 UNION SELECT“十月”为月 UNION SELECT“月”为月 UNION SELECT“月”为月 –

+0

为什么你在'SELECT'和'GROUP BY'中使用不同的日期格式? – vladkras

回答

6

考虑下面的标签乐

mysql> select * from cart ; 
+------+------------+-------------+ 
| id | date  | total_price | 
+------+------------+-------------+ 
| 1 | 2014-01-01 |   10 | 
| 2 | 2014-01-20 |   20 | 
| 3 | 2014-02-03 |   30 | 
| 4 | 2014-02-28 |   40 | 
| 5 | 2014-06-01 |   50 | 
| 6 | 2014-06-13 |   24 | 
| 7 | 2014-12-12 |   45 | 
| 8 | 2014-12-18 |   10 | 
+------+------------+-------------+ 

现在按照逻辑你回头看一年,december将在结果中出现两次,即dec 2013 and dec 2014,如果我们需要对他们单独计数,然后我们就可以使用生成动态的以下技术日期范围MySql Single Table, Select last 7 days and include empty rows

t1.month, 
t1.md, 
coalesce(SUM(t1.amount+t2.amount), 0) AS total 
from 
(
    select DATE_FORMAT(a.Date,"%b") as month, 
    DATE_FORMAT(a.Date, "%m-%Y") as md, 
    '0' as amount 
    from (
    select curdate() - INTERVAL (a.a + (10 * b.a) + (100 * c.a)) DAY as Date 
    from (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as a 
    cross join (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as b 
    cross join (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as c 
) a 
    where a.Date <= NOW() and a.Date >= Date_add(Now(),interval - 12 month) 
    group by md 
)t1 
left join 
(
    SELECT DATE_FORMAT(date, "%b") AS month, SUM(total_price) as amount ,DATE_FORMAT(date, "%m-%Y") as md 
    FROM cart 
    where Date <= NOW() and Date >= Date_add(Now(),interval - 12 month) 
    GROUP BY md 
)t2 
on t2.md = t1.md 
group by t1.md 
order by t1.md 
; 

输出将被

+-------+---------+-------+ 
| month | md  | total | 
+-------+---------+-------+ 
| Jan | 01-2014 | 30 | 
| Feb | 02-2014 | 70 | 
| Mar | 03-2014 |  0 | 
| Apr | 04-2014 |  0 | 
| May | 05-2014 |  0 | 
| Jun | 06-2014 | 74 | 
| Jul | 07-2014 |  0 | 
| Aug | 08-2014 |  0 | 
| Sep | 09-2014 |  0 | 
| Oct | 10-2014 |  0 | 
| Nov | 11-2014 |  0 | 
| Dec | 12-2013 |  0 | 
| Dec | 12-2014 | 55 | 
+-------+---------+-------+ 
13 rows in set (0.00 sec) 

如果你不关心上面的情况下,我.E。dec 2014 and dec 2013

然后只是为group by t1.month

+0

能否请您解释一下,你没交子查询中的连接部分。我想知道你做了什么,在这里选择CURDATE() - 间隔(AA +(10 * BA)+(100 * CA))一天日期 –

+0

另一个问题,如何通过过去12个月使这个查询命令,我想通过t2.date但由于NULL created_on不存在每月不正确排序.. –

+0

'选择CURDATE() - 间隔(AA +(10 * BA)'是生成取决于一系列动态的约会,你在看那么这个。会做左连接与origial查询,以便所有丢失的日期将出现在左表,也可用于订购使用T1数据,因为T2数据可能不总是存在。 –

1

感谢@pankaj提示,在这里,我通过这个查询解决它......

SELECT 
    SUM(IF(month = 'Jan', total, 0)) AS 'Jan', 
    SUM(IF(month = 'Feb', total, 0)) AS 'Feb', 
    SUM(IF(month = 'Mar', total, 0)) AS 'Mar', 
    SUM(IF(month = 'Apr', total, 0)) AS 'Apr', 
    SUM(IF(month = 'May', total, 0)) AS 'May', 
    SUM(IF(month = 'Jun', total, 0)) AS 'Jun', 
    SUM(IF(month = 'Jul', total, 0)) AS 'Jul', 
    SUM(IF(month = 'Aug', total, 0)) AS 'Aug', 
    SUM(IF(month = 'Sep', total, 0)) AS 'Sep', 
    SUM(IF(month = 'Oct', total, 0)) AS 'Oct', 
    SUM(IF(month = 'Nov', total, 0)) AS 'Nov', 
    SUM(IF(month = 'Dec', total, 0)) AS 'Dec', 
    SUM(total) AS total_yearly 
    FROM (
SELECT DATE_FORMAT(date, "%b") AS month, SUM(total_price) as total 
FROM cart 
WHERE date <= NOW() and date >= Date_add(Now(),interval - 12 month) 
GROUP BY DATE_FORMAT(date, "%m-%Y")) as sub 
+0

然而,这是来自你的问题的*不同*答案。在那里你选择了一个列输出,并根据你的评论正确地确定你需要一个辅助表。在这里,你正在生成一个元组输出,每行十二个月。 – LSerni

+0

是的你是正确的,我不知道如何做辅助表。你能解释一下吗?我的解决方案很好,可以接受。 –

+0

我请你原谅?你当然知道。 *你*描述了如何在你的评论中做到这一点......'SELECT ... UNION'技巧。在一个子选择中使用它,并且presto,那里有你的辅助桌子。乍一看,在我看来,@AbhikChakraborty发布了完整的解决方案。 – LSerni