在MySQL中包含NULL结果为0

时间:2014-11-25 13:33:09

标签: mysql

我的原始查询如下:

SELECT COUNT(*) AS count, YEAR(created_at) AS "year", MONTH(created_at) AS "month"
FROM quotes WHERE
(YEAR(created_at) = YEAR(CURDATE()) AND MONTH(created_at) = MONTH(CURDATE())
OR YEAR(created_at) = YEAR(CURDATE()) AND MONTH(created_at) = MONTH(CURDATE()) -1)
AND status_id = 1
GROUP BY YEAR(created_at), MONTH(created_at) DESC

此查询基本上会检索本月和上个月的COUNT并且工作正常,除非两个月都没有结果。

除了数周和数年之外,我有两个类似的查询。

我已尝试使用COALESCEIFNULL,但似乎并未包含NULL个结果。

SELECT IFNULL(COUNT(*), 0) AS count, YEAR(created_at) AS "year", MONTH(created_at) AS "month"
FROM quotes
WHERE
    (YEAR(created_at) = YEAR(CURDATE()) AND MONTH(created_at) = MONTH(CURDATE()) OR YEAR(created_at) = YEAR(CURDATE()) AND MONTH(created_at) = MONTH(CURDATE()) -1)
    AND status_id = 1
GROUP BY YEAR(created_at), MONTH(created_at) DESC

实际结果

count  |  year  | month
-----------------------
    1  |  2014  |  11

预期结果

count  |  year  | month
-----------------------
    1  |  2014  |  11
    0  |  2014  |  10

SQL Fiddle

3 个答案:

答案 0 :(得分:0)

您需要为想要查看的月份使用单独的数据集。您的SQLfiddle只是对Quotes上的行进行分组,因此不会显示几乎没有在结果集中显示的月份的汇总行。

使用您想要的月份尝试Creating a temporary table,然后执行简单的OUTER JOIN以选择出现的任何引号。

答案 1 :(得分:0)

只需在SUM功能中移动IFNULL,就像建议的评论一样,不够。 您只能按可用值进行分组。如果2014-10没有参赛作品,您将无法打印任何内容。 否则你会看到所有可能的组合。

注意:where子句仅限制结果,它对要显示的内容没有影响。 Select doens&#t;#34;知道"它必须显示月份10. becuas ethere在那里没有价值。

我不知道你想要达到什么目标,但在这种情况下,如果根本没有匹配的结果,我只会在程序中打印0。

答案 2 :(得分:0)

最简单的......

SELECT x.month
     , COUNT(q.id) total
  FROM (SELECT 10 month UNION SELECT 11) x 
  LEFT
  JOIN quotes q 
    ON MONTH(created_at) = month
 GROUP 
    BY month;