SQL 2008 SUM按日期指定范围

时间:2016-01-13 20:57:15

标签: sql sql-server-2008 sum

这是我到目前为止所拥有的。问题是我不希望这些结果出现在单独的结果窗口中。我希望它们在一个结果窗口中作为SUM分组托架日期,但是使用了特定的日期范围。

DECLARE @StartDate DATETIME, @EndDate DATETIME, @DailyBeginDate DATETIME
--SET ME WEEKLY
SELECT @StartDate = '12/7/2015 7:00:00', @EndDate = '1/13/2016 7:00:00'
SET @DailyBeginDate = @StartDate
WHILE @DailyBeginDate < @EndDate
BEGIN
SELECT SUM(TotalCouponBet),@DailyBeginDate from Play (nolock)
WHERE GameServerInsertDT >= @DailyBeginDate
AND GameServerInsertDT < DATEADD(DD, 1, @DailyBeginDate)
SELECT @DailyBeginDate = DATEADD(DD, 1, @DailyBeginDate)
END

1 个答案:

答案 0 :(得分:0)

您可以使用递归日期cte来获取日期,然后外部应用Play表格中的总和。

;WITH dateCTE
AS
(
    SELECT  @StartDate StartDate,
            DATEADD(DD,1,@StartDate) EndDate
    UNION ALL
    SELECT  DATEADD(DD,1,StartDate), 
            DATEADD(DD,1,EndDate)
    FROM    dateCTE
    WHERE   DATEADD(DD,1,StartDate) <= @EndDate
)

SELECT  cte.StartDate, 
        tcb.TotalCouponBet
FROM    dateCTE cte
OUTER APPLY (SELECT SUM(p.TotalCouponBet) TotalCouponBet 
             FROM   Play p (NOLOCK)
             WHERE  p.GameServerInsertDT >= cte.StartDate
                    AND p.GameServerInsertDT < DATEADD(DD,1,cte.EndDate)
            ) tcb

另一个选择是将CTE连接到Play表

;WITH dateCTE
AS
(
    SELECT  @StartDate StartDate,
            DATEADD(DD,1,@StartDate) EndDate
    UNION ALL
    SELECT  DATEADD(DD,1,StartDate), 
            DATEADD(DD,1,EndDate)
    FROM    dateCTE
    WHERE   DATEADD(DD,1,StartDate) <= @EndDate
)

SELECT  cte.StartDate, 
        SUM(tcb.TotalCouponBet) TotalCouponBet
FROM    dateCTE cte
        LEFT JOIN Play p (NOLOCK)   ON p.GameServerInsertDT >= cte.StartDate
                                    AND p.GameServerInsertDT < DATEADD(DD,1,cte.EndDate)
GROUP BY cte.StartDate

如果@EndDate时间不必与@StartDate时间匹配,您可以使用此cte获取最后一条记录的准确EndDate时间..

;WITH dateCTE
AS
(
    SELECT  @StartDate StartDate,
            (CASE WHEN DATEADD(DD,1,@StartDate) > @EndDate THEN @EndDate ELSE DATEADD(DD,1,@StartDate) END) EndDate
    UNION ALL
    SELECT  DATEADD(DD,1,StartDate), 
            CASE WHEN DATEADD(DD,1,EndDate) > @EndDate THEN @EndDate ELSE DATEADD(DD,1,EndDate) END
    FROM    dateCTE
    WHERE   DATEADD(DD,1,StartDate) <= @EndDate
)