一个名为的表VolumeRequest
按帐户存储日期范围内的卷请求。
AccountId StartDate EndDate DailyVolume
670 2013-07-01 00:00:00.000 2013-07-31 00:00:00.000 10
670 2013-07-01 00:00:00.000 2013-07-31 00:00:00.000 1050
670 2013-07-10 00:00:00.000 2013-07-10 00:00:00.000 -350
670 2013-07-24 00:00:00.000 2013-07-26 00:00:00.000 -350
673 2013-06-01 00:00:00.000 2013-07-31 00:00:00.000 233
我需要每天显示请求,其中在给定日期范围(例如 7 月)内按帐户按天计算量,报告如下所示。需要针对给定的报告日期修剪卷请求的日期开始日期和结束日期
AccountId Date Volume
670 2013-07-01 00:00:00.000 1060
670 2013-07-02 00:00:00.000 1060
.
.
670 2013-07-10 00:00:00.000 710
.
.
670 2013-07-24 00:00:00.000 710
670 2013-07-25 00:00:00.000 710
670 2013-07-26 00:00:00.000 710
.
.
670 2013-07-31 00:00:00.000 1060
673 2013-07-01 00:00:00.000 233
.
.
673 2013-07-31 00:00:00.000 233
现在我正在使用表变量和循环来实现它,我知道这不是一个好的编码方式。
DECLARE @sDate DATETIME, @eDate DATETIME , @volume DECIMAL (10, 4), rstartdate DATETIME, @renddate DATETIME , @loopcount INT
SET @sdate = '4/1/2013'
SET @edate = '4/30/2013'
DECLARE @VolumeRequest TABLE
(
ID INT IDENTITY (1, 1) PRIMARY KEY,
Aid INT,
Startdate DATETIME,
Enddate DATETIME,
volume DECIMAL (14, 4)
)
DECLARE @DailyRequest TABLE
(
ID INT IDENTITY (1, 1) PRIMARY KEY,
Accountid INT,
ReadDate DATETIME,
Volume DECIMAL (14, 4)
)
INSERT INTO @VolumeRequest
SELECT Accountid,
( CASE
WHEN @sdate > startdate THEN @sdate
ELSE startdate
END ),
( CASE
WHEN @edate < enddate THEN @edate
ELSE enddate
END ),
dailyvolume
FROM VolumeRequest
WHERE Startdate <= @edate
AND Enddate >= @sdate
AND isnull (deprecated, 0) != 1
--loop to breakdown the volume requests into daily requests
SET @loopcount = 1
WHILE @loopcount <= (SELECT MAX(ID)
FROM @VolumeRequest)
BEGIN
SELECT @volume = volume,
@rstartdate = Startdate,
@renddate = Enddate
FROM @VolumeRequest
WHERE ID = @loopcount
WHILE @rstartdate <= @renddate
BEGIN
INSERT INTO @DailyRequest
SELECT @currentaid,
@rstartdate,
@volume
SET @rstartdate = DATEADD(day, 1, @rstartdate)
END
SET @LoopCount = @LoopCount + 1
END
我正在寻找不涉及循环或游标的方法。我发现了一个类似的问题。那里的答案对我没有帮助。