MySQL中所有日期的返回计数,包括那些具有零结果的日期

时间:2013-10-09 18:52:06

标签: mysql sql date

我有一个MySQL表,如下所示:

+--------+------------+------------------+
|   id   | account_id |     posted_at    |
+--------+------------+------------------+
|   1    |       1    | 2013-10-05 23:09 |
|   2    |       1    | 2013-10-07 14:24 |
|   3    |       1    | 2013-10-07 01:17 |
|   4    |       1    | 2013-10-09 06:58 |
+--------+------------+------------------+

对于特定的account_id(在这种情况下为1),我想返回此(对于当月的日期):

+--------+------------+
|  count |    date    |
+--------+------------+
|    0   | 2013-10-01 |
|    0   | 2013-10-02 |
|    0   | 2013-10-03 |
|    0   | 2013-10-04 |
|    1   | 2013-10-05 |
|    0   | 2013-10-06 |
|    2   | 2013-10-07 |
|    0   | 2013-10-08 |
|    1   | 2013-10-09 |
+--------+------------+

我有一个SQL查询,它返回本月内每个日期的COUNTS。

SELECT 
    DATE(posted_at) AS formatted_date, 
    COUNT(id) AS count 
FROM entries 
WHERE account_id = 1 
    AND MONTH(DATE(posted_at)) = MONTH(NOW()) 
GROUP BY formatted_date 
ORDER BY formatted_date ASC

这只是回归:

+--------+------------+
|  count |    date    |
+--------+------------+
|    1   | 2013-10-05 |
|    2   | 2013-10-07 |
|    1   | 2013-10-09 |
+--------+------------+

当然,对于没有数据的日期,COUNT不会返回任何内容。我希望结果为没有数据的日期为零。

我已经读过你应该创建一个包含所有可能日期的连接表。这是唯一的方法吗?

1 个答案:

答案 0 :(得分:0)

您可以尝试这样的事情

Declare @INT DATETIME = null
SELECT COUNT( CASE WHEN @INT IS NOT NULL THEN @INT ELSE NULL END)

我不确定mysql但在sql server中它会是这样的......

SELECT 
    DATE(posted_at) AS formatted_date, 
    COUNT( CASE WHEN IS NOT NULL THEN posted_at ELSE NULL END ) AS [count] 
FROM entries 
WHERE account_id = 1 
    AND MONTH(DATE(posted_at)) = MONTH(NOW()) 
GROUP BY formatted_date 
ORDER BY formatted_date ASC