MySql count()每月有多少类型,如果没有找到记录则返回0

时间:2015-02-05 09:25:25

标签: mysql sql

我正在尝试创建一个报告,声明有多少声明= 0,有多少声明=每月1,如果没有记录则返回0。它花了我永远,到目前为止没有运气! 这是我到目前为止所得到的:

该表的简短版本:

+----+------------+---------+
| id | date_in    | claimed |   
+----+------------+---------+
| 1  | 2015-01-10 | 0       |
| 2  | 2015-01-09 | 1       |
| 3  | 2014-12-19 | 0       |
| 4  | 2014-11-07 | 0       |
| 5  | 2014-11-01 | 1       |
+----+------------+---------+

查询:

SELECT MONTH( date_in ) as date_in, COUNT( date_in ) AS total_items , claimed
    FROM item
    WHERE date_in >= NOW() - INTERVAL 1 YEAR
    GROUP BY MONTH(date_in), claimed

此查询为我提供了以下结果:

+---------+-------------+---------+
| date_in | total_items | claimed |     
+---------+-------------+---------+
| 1       | 1           | 0       |
| 2       | 1           | 0       |
| 2       | 1           | 1       |
| 5       | 4           | 0       |
| 5       | 4           | 1       |
| 6       | 479         | 0       |
| 6       | 167         | 1       |
| 7       | 729         | 0       |
| 7       | 211         | 1       |
| 8       | 790         | 0       |
| 8       | 229         | 1       |
| 9       | 307         | 0       |
| 9       | 66          | 1       |
+---------+-------------+---------+

但我想要的是:

+---------+-------------+---------+
| date_in | total_items | claimed |     
+---------+-------------+---------+
| 1       | 1           | 0       |
| 1       | 0           | 1       |
| 2       | 0           | 0       |
| 2       | 0           | 1       |
| 3       | 0           | 0       |
| 3       | 0           | 1       |
| 4       | 0           | 0       |
| 4       | 0           | 1       |
| 5       | 4           | 0       |
| 5       | 4           | 1       |
| 6       | 479         | 0       |
| 6       | 167         | 1       |
| 7       | 729         | 0       |
| 7       | 211         | 1       |
| 8       | 790         | 0       |
| 8       | 229         | 1       |
| 9       | 307         | 0       |
| 9       | 66          | 1       |
| 10      | 0           | 0       |
| 10      | 0           | 1       |
| 11      | 0           | 0       |
| 11      | 0           | 1       |
| 12      | 0           | 0       |
| 12      | 0           | 1       |
+---------+-------------+---------+

1 个答案:

答案 0 :(得分:2)

也许你会找到一个结果如下的解决方案: date_in total_items_claimed total_items_unclaimed

SELECT MONTH( date_in ) as date_in,
SUM(IF(claimed, 1, 0)) AS total_items_claimed,
SUM(IF(claimed, 0, 1)) AS total_items_unclaimed
FROM item
WHERE date_in >= NOW() - INTERVAL 1 YEAR
GROUP BY MONTH(date_in)

希望你喜欢它:) 编辑:
为了检索没有记录的monts,您必须与另一个为此创建的表格交叉:
Create an inline SQL table on the fly (for an excluding left join)所示,您可以添加month_table:

SELECT 
  date_in, 
  total_items_claimed, 
  total_items_unclaimed, 
  COALESCE(total_items_claimed, 0) + COALESCE(total_items_unclaimed, 0) as total_items 
FROM (
  SELECT 
    MONTH( date_in ) as date_in,
    SUM(IF(claimed, 1, 0)) AS total_items_claimed,
    SUM(IF(claimed, 0, 1)) AS total_items_unclaimed
  FROM item
  WHERE date_in >= NOW() - INTERVAL 1 YEAR
  GROUP BY MONTH(date_in)
) as items_count LEFT JOIN (
  SELECT 1 AS MONTH UNION
  SELECT 2 AS MONTH UNION
  SELECT 3 AS MONTH UNION
  SELECT 4 AS MONTH UNION
  SELECT 5 AS MONTH UNION
  SELECT 6 AS MONTH UNION
  SELECT 7 AS MONTH UNION
  SELECT 8 AS MONTH UNION
  SELECT 9 AS MONTH UNION
  SELECT 10 AS MONTH UNION
  SELECT 11 AS MONTH UNION
  SELECT 12 AS MONTH 
) as months_table on items_count.date_in = months_table.month

我没有测试过这个查询,祝你好运! :)