2013-10-16 104 views
1

我正在对我们的SQL(2012)数据库运行查询,该查询返回给定日期范围内按日期分组的记录数。强制从SQL查询返回日期范围内的行数

例如:

Date Count 
12/08 12 
14/08 19 
19/08 11 

我需要填补空白为我绘制就会上当受骗,因为有遗漏值的图表。有没有办法强制SQL报告空白行,或者当它没有遇到结果时显示“0”值?

我的查询是

SELECT TheDate, count(recordID) 
FROM myTable 
WHERE (TheDate between '12-AUG-2013 00:00:00' and '20-AUG-2013 23:59:59') 
GROUP BY TheDate 

我需要创建一个临时表中的记录,然后从该选择并右键从myTable的加入任何记录?

感谢您的帮助!

回答

2

如果您创建的日期范围的(临时或永久)表,然后你可以left join你的结果,以创建一个结果集包括空白

SELECT dates.TheDate, count(recordID) 
FROM 
(select 
     convert(date,dateadd(d,number,'2013-08-12')) as theDate 
    from master..spt_values 
    where type='p' and number < 9 
) dates 
left join yourtable on dates.thedate = convert(date,yourtable.thedate) 
GROUP BY dates.TheDate 
0

一个临时表可以完成这项工作,但是对于如此小的日期范围,您可以更简单一些,并使用一个UNION -ed子查询。例如:

SELECT dates.TheDate, ISNULL(counts.Records, 0) 
FROM 
(SELECT TheDate, count(recordID) AS Records 
FROM myTable 
WHERE (TheDate between '12-AUG-2013 00:00:00' and '20-AUG-2013 23:59:59') 
GROUP BY TheDate 
) counts 
RIGHT JOIN 
(SELECT CAST('12-AUG-2013' AS DATETIME) AS TheDate 
UNION ALL SELECT CAST('13-AUG-2013' AS DATETIME) AS TheDate 
UNION ALL SELECT CAST('14-AUG-2013' AS DATETIME) AS TheDate 
UNION ALL SELECT CAST('15-AUG-2013' AS DATETIME) AS TheDate 
UNION ALL SELECT CAST('16-AUG-2013' AS DATETIME) AS TheDate 
UNION ALL SELECT CAST('17-AUG-2013' AS DATETIME) AS TheDate 
UNION ALL SELECT CAST('18-AUG-2013' AS DATETIME) AS TheDate 
UNION ALL SELECT CAST('19-AUG-2013' AS DATETIME) AS TheDate 
UNION ALL SELECT CAST('20-AUG-2013' AS DATETIME) AS TheDate 
) dates 
ON counts.TheDate = dates.TheDate 

这是SQL Fiddle Demo

如果您需要更通用(但也更复杂)的解决方案,请查看this excellent answer(by @RedFilter)以解决类似的问题。