Mysql 包括空月份

Mysql 包括空月份,mysql,group-by,Mysql,Group By,我在获取查询的正确结果时遇到问题 我正在做一个查询,以获得每个月有多少用户注册。到目前为止,我提出了以下查询,它允许我获得该结果,但没有显示没有注册用户的月份 结果: +------+-------+-------+ | YEAR | MONTH | Total | +------+-------+-------+ | 2016 | Feb | 1 | | 2016 | Apr | 1 | | 2016 | May | 1 | | 2016 | Jul

我在获取查询的正确结果时遇到问题
我正在做一个查询,以获得每个月有多少用户注册。到目前为止,我提出了以下查询,它允许我获得该结果,但没有显示没有注册用户的月份


结果:

+------+-------+-------+
| YEAR | MONTH | Total |
+------+-------+-------+
| 2016 | Feb   |     1 |
| 2016 | Apr   |     1 |
| 2016 | May   |     1 |
| 2016 | Jul   |     1 |
+------+-------+-------+
4 rows in set (0.00 sec)
我希望它是这样的

+------+-------+-------+
| YEAR | MONTH | Total |
+------+-------+-------+
| 2016 | Jan   |     0 |
| 2016 | Feb   |     1 |
| 2016 | Mar   |     0 |
| 2016 | Apr   |     1 |
| 2016 | May   |     1 |
| 2016 | Jun   |     0 |
| 2016 | Jul   |     1 |
| 2016 | Aug   |     0 |
| 2016 | Sep   |     0 |
| 2016 | Oct   |     0 |
| 2016 | Nov   |     0 |
| 2016 | Dec   |     0 |
+------+-------+-------+
像这样试试

使用
SUM
而不是
COUNT
。不管怎么说,你要显示零或一

 SELECT 
    YEAR(c.created_at) as 'YEAR',
    (CASE WHEN MONTH(c.created_at)=1 THEN 'Jan' 
      WHEN (MONTH(c.created_at)=2) THEN 'Feb'
      WHEN (MONTH(c.created_at)=3) THEN 'Mar'
      WHEN (MONTH(c.created_at)=4) THEN 'Apr'
      WHEN (MONTH(c.created_at)=5) THEN 'May'
      WHEN (MONTH(c.created_at)=6) THEN 'Jun'
      WHEN (MONTH(c.created_at)=7) THEN 'Jul'
      WHEN (MONTH(c.created_at)=8) THEN 'Aug'
      WHEN (MONTH(c.created_at)=9) THEN 'Sep'
      WHEN (MONTH(c.created_at)=10) THEN 'Oct' 
      WHEN (MONTH(c.created_at)=11) THEN 'Nov'
      WHEN (MONTH(c.created_at)=12) THEN 'Dec'
    END) AS 'MONTH',
    SUM (CASE WHEN c.id IS NOT NULL THEN 1 ELSE 0 END ) as Total
 FROM customers as c
 WHERE YEAR(c.created_at) = 2016
 GROUP BY c.id, MONTH(c.created_at)
 ORDER BY YEAR(c.created_at), MONTH(c.created_at), Total ASC
像这样试试

使用
SUM
而不是
COUNT
。不管怎么说,你要显示零或一

 SELECT 
    YEAR(c.created_at) as 'YEAR',
    (CASE WHEN MONTH(c.created_at)=1 THEN 'Jan' 
      WHEN (MONTH(c.created_at)=2) THEN 'Feb'
      WHEN (MONTH(c.created_at)=3) THEN 'Mar'
      WHEN (MONTH(c.created_at)=4) THEN 'Apr'
      WHEN (MONTH(c.created_at)=5) THEN 'May'
      WHEN (MONTH(c.created_at)=6) THEN 'Jun'
      WHEN (MONTH(c.created_at)=7) THEN 'Jul'
      WHEN (MONTH(c.created_at)=8) THEN 'Aug'
      WHEN (MONTH(c.created_at)=9) THEN 'Sep'
      WHEN (MONTH(c.created_at)=10) THEN 'Oct' 
      WHEN (MONTH(c.created_at)=11) THEN 'Nov'
      WHEN (MONTH(c.created_at)=12) THEN 'Dec'
    END) AS 'MONTH',
    SUM (CASE WHEN c.id IS NOT NULL THEN 1 ELSE 0 END ) as Total
 FROM customers as c
 WHERE YEAR(c.created_at) = 2016
 GROUP BY c.id, MONTH(c.created_at)
 ORDER BY YEAR(c.created_at), MONTH(c.created_at), Total ASC

您可以根据

创建一个12行表以进行外部连接。您可以根据

创建一个12行表以进行外部连接。我已经提出了这个解决方案,它非常适合我的情况。
我使用以下查询为月份创建了一个关键表

SELECT 
YEAR(b.created_at) as 'YEAR',
COUNT(CASE WHEN MONTH(b.created_at)=1 THEN b.id END) as Jan,
COUNT(CASE WHEN MONTH(b.created_at)=2 THEN b.id END) as Feb,
COUNT(CASE WHEN MONTH(b.created_at)=3 THEN b.id END) as Mar,
COUNT(CASE WHEN MONTH(b.created_at)=4 THEN b.id END) as Apr,
COUNT(CASE WHEN MONTH(b.created_at)=5 THEN b.id END) as May,
COUNT(CASE WHEN MONTH(b.created_at)=6 THEN b.id END) as Jun,
COUNT(CASE WHEN MONTH(b.created_at)=7 THEN b.id END) as Jul,
COUNT(CASE WHEN MONTH(b.created_at)=8 THEN b.id END) as Aug,
COUNT(CASE WHEN MONTH(b.created_at)=9 THEN b.id END) as Sep,
COUNT(CASE WHEN MONTH(b.created_at)=10 THEN b.id END) as Oct,
COUNT(CASE WHEN MONTH(b.created_at)=11 THEN b.id END) as Nov,
COUNT(CASE WHEN MONTH(b.created_at)=12 THEN b.id END) as 'Dec',
COUNT(b.id) as Total
FROM customers as b 
GROUP BY YEAR(b.created_at)
ORDER BY YEAR(b.created_at) ASC
产生此输出的组件

+------+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-------+
| YEAR | Jan | Feb | Mar | Apr | May | Jun | Jul | Aug | Sep | Oct | Nov | Dec | Total |
+------+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-------+
| 2015 |   0 |   0 |   0 |   0 |   0 |   0 |   1 |   0 |   0 |   0 |   1 |   0 |     2 |
| 2016 |   0 |   1 |   0 |   1 |   1 |   0 |   1 |   0 |   0 |   0 |   0 |   0 |     4 |
+------+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-------+
2 rows in set (0.00 sec)

从技术上讲,它解决了这个问题,因为它包括空月。

我已经提出了这个解决方案,它很适合我的情况。
我使用以下查询为月份创建了一个关键表

SELECT 
YEAR(b.created_at) as 'YEAR',
COUNT(CASE WHEN MONTH(b.created_at)=1 THEN b.id END) as Jan,
COUNT(CASE WHEN MONTH(b.created_at)=2 THEN b.id END) as Feb,
COUNT(CASE WHEN MONTH(b.created_at)=3 THEN b.id END) as Mar,
COUNT(CASE WHEN MONTH(b.created_at)=4 THEN b.id END) as Apr,
COUNT(CASE WHEN MONTH(b.created_at)=5 THEN b.id END) as May,
COUNT(CASE WHEN MONTH(b.created_at)=6 THEN b.id END) as Jun,
COUNT(CASE WHEN MONTH(b.created_at)=7 THEN b.id END) as Jul,
COUNT(CASE WHEN MONTH(b.created_at)=8 THEN b.id END) as Aug,
COUNT(CASE WHEN MONTH(b.created_at)=9 THEN b.id END) as Sep,
COUNT(CASE WHEN MONTH(b.created_at)=10 THEN b.id END) as Oct,
COUNT(CASE WHEN MONTH(b.created_at)=11 THEN b.id END) as Nov,
COUNT(CASE WHEN MONTH(b.created_at)=12 THEN b.id END) as 'Dec',
COUNT(b.id) as Total
FROM customers as b 
GROUP BY YEAR(b.created_at)
ORDER BY YEAR(b.created_at) ASC
产生此输出的组件

+------+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-------+
| YEAR | Jan | Feb | Mar | Apr | May | Jun | Jul | Aug | Sep | Oct | Nov | Dec | Total |
+------+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-------+
| 2015 |   0 |   0 |   0 |   0 |   0 |   0 |   1 |   0 |   0 |   0 |   1 |   0 |     2 |
| 2016 |   0 |   1 |   0 |   1 |   1 |   0 |   1 |   0 |   0 |   0 |   0 |   0 |     4 |
+------+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-------+
2 rows in set (0.00 sec)
从技术上讲,它解决了这个问题,因为它包括空月份