使用Count(*)进行SQL查询并选择缺少月份

时间:2015-12-04 01:07:11

标签: mysql sql

我正在使用MySQL数据库。

我想从表中计算一个月内的所有行。这个脚本为我生成了正确的输出:

SELECT Count(*) as size, DATE_FORMAT(mydate, "%Y-%m") as mydate
FROM Table
GROUP BY DATE_FORMAT(mydate, "%Y-%m") ASC

输出是一个带有数字和日期属性的表。 例如:

10 | 2011-01
40 | 2011-03
20 | 2011-05

我的问题是,我的数据库中没有任何行的月份不会出现在输出中。这在现在是正常的。

我想编写一个sql查询,它产生如下输出:

10 | 2011-01
0  | 2011-02
40 | 2011-03
0  | 2011-04
20 | 2011-05

如果可能的话,我想只使用纯SQL语言解决这个问题。

有人可以帮我解决这个SQL脚本吗?

2 个答案:

答案 0 :(得分:2)

我建议创建一个永久日期表并离开加入(非常方便),或者你可以制作一个充满日期的临时日期表:

command.CommandText = "ALTER TABLE ? ADD COLUMN [?] ? NULL";
command.CommandText = "ALTER TABLE ? ADD COLUMN [?] ?";
command.CommandText = "ALTER TABLE [?] ADD COLUMN ? ? ";
command.CommandText = "ALTER TABLE ? ADD COLUMN ? MEMO ";

然后使用您的查询作为子查询,执行左连接以获取缺少的日期

CREATE TEMPORARY TABLE daterange (dte DATE); 

SET @counter := -1;
WHILE (@counter < DATEDIFF(DATE(_todate), DATE(_fromdate))) DO 
    INSERT daterange VALUES (DATE_ADD(_fromdate, INTERVAL @counter:=@counter + 1 DAY));
END WHILE;

完成后删除临时表:

SELECT ifnull(data.thecount,0) as theCount, daterange.dte FROM 
daterange LEFT JOIN
(
   SELECT COUNT(*) AS theCount, DATE_FORMAT(dates.dte, "%Y-%m") as mydate
   FROM table
   GROUP BY DATE_FORMAT(dates.dte, "%Y-%m") ASC
) DATA 
    ON daterange.dte = DATA.mydate
   ORDER BY daterange.dte asc
编辑:左连接非常非常错误,修复此处。您可能需要使用格式

答案 1 :(得分:2)

查看我的fiddle

解决方案基于calendar tables article

完整列表如下:

size| mydate
------------
10  | 2011-01
0   | 2011-02
40  | 2011-03
0   | 2011-04
20  | 2011-05
0   | 2011-06
0   | 2011-07
0   | 2011-08
0   | 2011-09
0   | 2011-10
0   | 2011-11
0   | 2011-12

结果

{{1}}