首先,感谢任何帮助我解决这个问题的人。我使用的是 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.RequestType,
M.Area
ORDER BY
C.myDate,
M.RequestType,
M.Area
根据您的潜在日期范围有多大,填充表变量可能需要一段时间。例如,如果范围跨越十年或两年。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)