如何构建此sql查询
我想在sql中查找记录 从2012年8月25日至2012年9月1日 我想按日期分组 这是我的问题如何构建此sql查询,sql,sql-server,sql-server-2005,Sql,Sql Server,Sql Server 2005,我想在sql中查找记录 从2012年8月25日至2012年9月1日 我想按日期分组 这是我的问题 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) G
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,但运气不佳
非常感谢..您的查询无法直接修改以返回所需的数据。要计算有问题的日期,目标表中必须有实际具有这些日期的记录;然而,在您的例子中,日期只是查询中的参数。因此,无法将它们合并到结果集中 您必须创建一个包含所有需要数据的日期的辅助表,然后将查询重新特征化为从该日期表到目标表的左外部联接。反过来,这将为日期表中的日期提供零计数,但目标表中没有。使用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)
结果中缺少这些日期的原因是表中没有这些日期的数据,但是,以下内容将确保您获得指定范围内的所有日期:
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
您正在使用什么rdbms?此外,version.databases不会为不存在的日期创建计数。如果要包含零计数日期,则必须创建一个临时表,列出其中每个日期,并与之关联。sql server 2005我在表中没有2012年8月25日和2012年8月26日的记录,因此我希望为0。请建议您是否有更好的解决方案出于兴趣,为什么要将一些日期转换为103格式,请提供一个按日期获取订单的解决方案。您必须将转换格式从105更改为101,这样做可能不适合您的日期格式。但是,在GROUP BY之后,您需要添加以下内容:ORDER BY CONVERTVARCHAR10,t2.[date],101不要忘记在它提到的任何地方将105更改为101,并在需要时指定ORDER BY direction。