有趣的SQL加入日期之间的日期

前端之家收集整理的这篇文章主要介绍了有趣的SQL加入日期之间的日期前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
首先,感谢任何帮助我解决这个问题的人.我正在使用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

根据您的潜在日期范围有多大,填写表变量可能需要一些时间.例如,如果范围跨越十或二.

猜你在找的MsSQL相关文章