Select 并创建月份行并计算数据 - MySQL

Select and create month row and count the data - MySQL

我遇到了问题。我有如下数据:

-----------------------
|  last_login_dt      |
-----------------------
| 2015-08-11 08:06:36 |
| 2015-06-10 22:06:43 |
| 2015-06-11 08:06:58 |
| 2015-09-11 08:06:45 |
-----------------------

到目前为止,我设法统计了此类数据并使用以下语句将其转换为:

SELECT DATE_FORMAT(last_login_dt,'%m/%Y') as `month`,
count(last_login_dt) as `total_visits` from public_user
WHERE DATE_FORMAT(last_login_dt,'%Y') = YEAR(CURDATE()) 
group by DATE_FORMAT(last_login_dt,'%m/%Y')
order by `month` asc;

----------------------------
|  month  |  total_visits  |
----------------------------
| 06/2015 |       2        |
| 08/2015 |       1        |
| 09/2015 |       1        |
----------------------------

问题是,如何将结果变成如下所示。相反,此 table 只有 4 行数据,如何创建一月、二月、三月、四月... total_visit = 0:

的行
---------------------
|  Month  |  Total  |
---------------------
|   Jan   |    0    |
|   Feb   |    0    |
|   Mar   |    0    |
|   Apr   |    0    |
|   May   |    0    |
|   Jun   |    2    |
|   Jul   |    0    |
|   Aug   |    1    |
|   Sep   |    1    |
|   Oct   |    0    |
|   Nov   |    0    |
|   Dis   |    0    |
--------------------- 

你快到了。在你的日期格式字符串中试试这个 %b:

mysql> SELECT DATE_FORMAT(NOW(), '%b');
+--------------------------+
| DATE_FORMAT(NOW(), '%b') |
+--------------------------+
| Jun                      |
+--------------------------+
1 row in set (0.00 sec)

mysql>

月份名称的格式为 %b。 所以我认为您必须将 %m 更改为 %b。

试试这个 sql 如果它有效:

SELECT DATE_FORMAT(last_login_dt,'%b/%Y') as `month`,
count(last_login_dt) as `total_visits` from public_user
WHERE DATE_FORMAT(last_login_dt,'%Y') = YEAR(CURDATE()) 
group by DATE_FORMAT(last_login_dt,'%m/%Y')
order by `month` asc;

更新截至 2015 年 6 月 11 日 11:57 上午 GMT+8

我们无法在行中显示月份列表,但我曾经制作一个派生列来显示月份并在 total_visits 行中。我用 case 查询来检查日期是否是特定月份。

SELECT
CASE WHEN DATE_FORMAT(last_login_dt,'%m') = '01' THEN count(last_login_dt) ELSE '0' END AS Jan,
CASE WHEN DATE_FORMAT(last_login_dt,'%m') = '02' THEN count(last_login_dt) ELSE '0' END AS Feb,
CASE WHEN DATE_FORMAT(last_login_dt,'%m') = '03' THEN count(last_login_dt) ELSE '0' END AS Mar,
CASE WHEN DATE_FORMAT(last_login_dt,'%m') = '04' THEN count(last_login_dt) ELSE '0' END AS Apr,
CASE WHEN DATE_FORMAT(last_login_dt,'%m') = '05' THEN count(last_login_dt) ELSE '0' END AS May,
CASE WHEN DATE_FORMAT(last_login_dt,'%m') = '06' THEN count(last_login_dt) ELSE '0' END AS Jun,
CASE WHEN DATE_FORMAT(last_login_dt,'%m') = '07' THEN count(last_login_dt) ELSE '0' END AS Jul,
CASE WHEN DATE_FORMAT(last_login_dt,'%m') = '08' THEN count(last_login_dt) ELSE '0' END AS Aug,
CASE WHEN DATE_FORMAT(last_login_dt,'%m') = '09' THEN count(last_login_dt) ELSE '0' END AS Sep,
CASE WHEN DATE_FORMAT(last_login_dt,'%m') = '10' THEN count(last_login_dt) ELSE '0' END AS Oct,
CASE WHEN DATE_FORMAT(last_login_dt,'%m') = '11' THEN count(last_login_dt) ELSE '0' END AS Nov,
CASE WHEN DATE_FORMAT(last_login_dt,'%m') = '12' THEN count(last_login_dt) ELSE '0' END AS `Dec`
FROM public_user;

结果将是:

------------------------------------------------------------------------
| Jan | Feb |  Mar|  Apr|  May|  Jun|  Jul| Aug | Sep| Oct | Nov | Dec |
------------------------------------------------------------------------
|  0  |  0  |  0  |  0  |  0  |  2  |  0  |  1  |  1 |  0  |  0  |  0  |
------------------------------------------------------------------------

我使用了您自己的查询,因为它可以正常工作并且我对其进行了一些修改。考虑以下查询:

SELECT `month`, `total_visits` FROM
(
SELECT * FROM
(
SELECT '01' AS `month_num`, 'Jan' As `month`, 0 AS `total_visits`
UNION
SELECT '02' AS `month_num`, 'Feb' AS `month`, 0 AS `total_visits`
UNION
SELECT '03' AS `month_num`, 'Mat' AS `month`, 0 AS `total_visits`
UNION
SELECT '04' AS `month_num`, 'Apr' AS `month`, 0 AS `total_visits`
UNION
SELECT '05' AS `month_num`, 'May' AS `month`, 0 AS `total_visits`
UNION
SELECT '06' AS `month_num`, 'Jun' AS `month`, 0 AS `total_visits`
UNION
SELECT '07' AS `month_num`, 'Jul' AS `month`, 0 AS `total_visits`
UNION
SELECT '08' AS `month_num`, 'Aug' AS `month`, 0 AS `total_visits`
UNION
SELECT '09' AS `month_num`, 'Sep' AS `month`, 0 AS `total_visits`
UNION
SELECT '10' AS `month_num`, 'Oct' AS `month`, 0 AS `total_visits`
UNION
SELECT '11' AS `month_num`, 'Nov' AS `month`, 0 AS `total_visits`
UNION
SELECT '12' AS `month_num`, 'Dec' AS `month`, 0 AS `total_visits`
UNION

SELECT DATE_FORMAT(last_login_dt,'%m') as `month_num`, DATE_FORMAT(last_login_dt,'%b') as `month`,
count(last_login_dt) as `total_visits` from public_user
WHERE DATE_FORMAT(last_login_dt,'%Y') = YEAR(CURDATE())
group by DATE_FORMAT(last_login_dt,'%m/%Y')
order by `total_visits` desc

) AS tmp

GROUP BY `month`
) AS total_visits
ORDER BY `month_num`;

结果是:

---------------------
|  Month  |  Total  |
---------------------
|   Jan   |    0    |
|   Feb   |    0    |
|   Mar   |    0    |
|   Apr   |    0    |
|   May   |    0    |
|   Jun   |    2    |
|   Jul   |    0    |
|   Aug   |    1    |
|   Sep   |    1    |
|   Oct   |    0    |
|   Nov   |    0    |
|   Dis   |    0    |
--------------------- 

我首先创建了显示月份的 table 及其 total_visits(显然是 0)。然后我将您的查询与我创建的派生 table 联合起来。我还添加了 month_num 字段,其唯一目的是按月对数据进行排序,尽管它没有显示在最终结果中。