首先,感谢任何帮助我解决这个问题的人.我正在使用sql 2005,但如果05中没有可用的解决方案,可以使用2008.
我有一排数据看起来像这样:
select * from mySPtable | myPK | Area | RequestType | StartDate | EndDate | 1 SB ADD 8/14/2011 8/18/2011 2 NB RMV 8/16/2011 8/16/2011
所以我想做的就是每天对每个区域的总请求数.结果应该是:
| myDate | RequestType | Area | myCount | 8/14/2011 ADD SB 1 8/15/2011 ADD SB 1 8/16/2011 ADD SB 1 8/16/2011 RMV NB 1 8/17/2011 ADD SB 1 8/18/2011 ADD SB 1
解决方法
你需要一个日历表,或者你可以生成一个CTE.一旦你这样做,其余的查询应该是相当微不足道的. CTE方法可能有点复杂,由于递归问题,不允许使用聚合,所以下面我使用了一个表变量.您也可以将其保留在数据库中的永久表.
SET NOCOUNT ON DECLARE @Calendar TABLE (my_date DATETIME NOT NULL) DECLARE @date DATETIME,@max_date DATETIME SELECT @date = MIN(StartDate),@max_date = MAX(EndDate) FROM My_Table WHILE (@date <= @max_date) BEGIN INSERT INTO @Calendar (my_date) VALUES (@date) SELECT @date = DATEADD(dy,1,@date) END SELECT C.myDate,M.RequestType,M.Area,COUNT(*) AS myCount FROM @Calendar C INNER JOIN My_Table M ON M.StartDate <= C.myDate AND M.EndDate >= C.myDate GROUP BY C.myDate,M.Area ORDER BY C.myDate,M.Area
根据您的潜在日期范围有多大,填写表变量可能需要一些时间.例如,如果范围跨越十或二.