2012-09-04 38 views
-1

我想从说25-08-2012至2012年1月9日 找到SQL 记录,并通过我迄今为止如何建立这个sql查询

这里想组是我的查询

SELECT CONVERT(VARCHAR(10), date, 105) AS dt, 
COUNT(id) AS cnt 
FROM tablename 
WHERE date BETWEEN CONVERT(DATETIME, '21-08-2012 00:00:00:000',103) 
AND CONVERT(DATETIME, '01-09-2012 23:59:00:000' ,103) 
GROUP BY CONVERT(VARCHAR(10), date, 105) 

我得到的结果

dt     cnt 
01-09-2012   48 
27-08-2012   1 
28-08-2012   3 
29-08-2012   11 
30-08-2012   3 

但预计它作为

dt     cnt 
25-08-2012   0 
26-08-2012   0 
01-09-2012   48 
27-08-2012   1 
28-08-2012   3 
29-08-2012   11 
30-08-2012   3 

我如何我可以修改上面的查询 也试图与CASE,但没有运气

许多谢谢..

+0

你正在使用什么rdbms?也是版本。 –

+4

数据库不会为不存在的日期创建计数。如果您想包含零计数日期,则必须创建一个列出每个日期的临时表并加入它们。 –

+0

SQL Server 2005中我没有在表中的记录进行25-08-2012及26-08-2012,所以我想为0请建议如果u有奥比更好的解决方案 –

回答

3

你缺少的结果,这些日期的原因是,有没有数据,它们在你的餐桌,然而,以下将确保你得到所有日期的指定范围:

CREATE TABLE #tmp_dates ([date] datetime) 

DECLARE @dt_start datetime, @dt_end datetime, @dt_dif int 

SET @dt_start = CONVERT(DATETIME, '21-08-2012 00:00:00:000',103) 
SET @dt_end = CONVERT(DATETIME, '01-09-2012 23:59:00:000' ,103) 
SET @dt_dif = datediff(day,@dt_start,@dt_end) 

WHILE @dt_dif >= 0 BEGIN 
INSERT INTO #tmp_dates 
SELECT dateadd(day,@dt_dif,@dt_start) 
SET @dt_dif = @dt_dif - 1 
END 

SELECT CONVERT(VARCHAR(10), t2.[date], 101) AS dt, COUNT(t1.id) AS cnt 
INTO #tmp_result 
FROM tablename t1 
RIGHT OUTER JOIN #tmp_dates t2 
ON CONVERT(VARCHAR(10), t1.[date], 101) = CONVERT(VARCHAR(10), t2.[date], 101) 
GROUP BY CONVERT(VARCHAR(10), t2.[date], 101) 
ORDER BY CONVERT(DATETIME,CONVERT(VARCHAR(10), t2.[date], 101)) ASC /* DESC */ 

SELECT convert(VARCHAR(10),CONVERT(DATETIME,dt),105) as dt,cnt FROM #tmp_result 

DROP TABLE #tmp_dates 
DROP TABLE #tmp_result 
+0

真棒曼联拯救我的一天谢谢.. –

+0

能否提供一个解决方案按日期来获得订单 –

+0

你将不得不转换格式改变为105〜101为了做到这一点(它可能不适合你的日期格式。虽然然而,正确的组后'BY'则需要添加如下内容:'ORDER BY CONVERT(VARCHAR(10),T2 [日期],101)'不要忘记更改105到101无处不在提到它和如果需要通过方向指定顺序。 – MazBros

2

您的查询不能直接修改,以返回所需的数据。要计算有问题的日期,目标表中必须有实际具有这些日期的记录;但在您的情况下,日期仅仅是查询中的参数。因此,无法将它们合并到结果集中。

您必须创建一个辅助表,其中包含您希望为其获取数据的所有日期,然后将您的查询重新定性为从该日期表到目标表的左外连接。这反过来会给你“日期”表中存在的日期的零计数,但是在目标表中没有。

0

如何使用IsNull()?让我知道这个是否奏效。

SELECT CONVERT(VARCHAR(10), date, 105) AS dt, 
ISNULL(COUNT(id),0) AS cnt 
FROM tablename 
WHERE date BETWEEN CONVERT(DATETIME, '21-08-2012 00:00:00:000',103) 
AND CONVERT(DATETIME, '01-09-2012 23:59:00:000' ,103) 
GROUP BY CONVERT(VARCHAR(10), date, 105)