MYSQL查询 - 按月获得总计并显示零总计

时间:2016-05-25 18:46:05

标签: mysql select

我喜欢这张表

 MySQL> select * from order;
    +-----+-------------+---------------+
    | id  | order_total |  payment_date |
    +-----+-------------+---------------+
    |   1 |          35 |    2015-05-17 |
    |   2 |          35 |    2015-03-17 |
    |   3 |          65 |    2015-02-04 |
    |   4 |          39 |    2015-01-01 |
    |   5 |          19 |    2015-01-21 |
    |   6 |          27 |    2015-10-21 |
    |   7 |          74 |    2015-02-15 |
    |   8 |          81 |    2015-09-13 |
    |   9 |          86 |    2015-03-01 |
    |  10 |          42 |    2015-07-08 |
    |  11 |          73 |    2015-05-19 |
    |  12 |          78 |    2015-07-20 |
    |  13 |          92 |    2015-02-04 |
    ......
    |1913 |          71 |    2015-11-04 |
    +-----+-------------+---------------+

我需要结果向我展示2015年的每月付款 我尝试使用

SELECT MONTHNAME(payment_date), 
       SUM(order_total) 
FROM order 
GROUP BY YEAR(payment_date), 
         MONTH(payment_date) 

但它没有给出零个月 我也看了question,但他有两张桌子 我需要结果向我显示每月付款总额如此

+-----+-------+
| MM  | Total | 
+-----+-------+
|  01 |  5735 |
|  02 |  2535 | 
|  03 |  1065 | 
|  04 |     0 | 
|  05 |   919 | 
|  06 |     0 | 
|  07 |  2874 | 
|  08 |     0 | 
|  09 |  6086 | 
|  10 |  2042 | 
|  11 |  1973 | 
|  12 |     0 | 
+-----+-------+

2 个答案:

答案 0 :(得分:1)

这几个月需要一个行来源,你需要返回12行。有几种可行的方法可以做到这一点。一种方法是使用内联视图返回十二行,而不创建表。

例如:

s = '<tag>uTSqUYRR8gapple</tag><tag>K9VGTZM3h8</tag><tag>pearTYysnMXMUc</tag><tag>udv5NZQdpzpearz5a4oS85mD</tag>'
import re; re.findall("<tag>.*?</tag>", s)

答案 1 :(得分:0)

您需要一个包含所有月份的月份表。选中 answer

<强> allMonths

  id, year, month

然后创建左连接

 SELECT a.year, a.month,  COALESCE(SUM(o.order_total ),0) as total
 FROM allMonths a
 LEFT JOIN orders o
        ON a.year = YEAR(payment_date)
       AND a.month = MONTH(payment_date)
 GROUP BY a.year, 
          a.month

编辑:

此外,您可以随时将日期截断为月份的第一天,而不是使用月份和年份

 SELECT DATE_FORMAT(payment_date, '%Y-%m-01');

在这种情况下,加入条件很容易保存,例如yyyy-mm-01

   ON a.month = DATE_FORMAT(payment_date, '%Y-%m-01')