我正在使用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脚本吗?
答案 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}}