我正在尝试创建一个报告,声明有多少声明= 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 |
+---------+-------------+---------+
答案 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
我没有测试过这个查询,祝你好运! :)