私は毎日プロバイダとアクティブなクライアントの合計を表示するこのテーブルを持っています。SQL Serverのセットベースのアプローチでwhileループを置き換えます
DailyClientPopulation
テーブル:
Provider Activeclients DateAdded
------- ------------- ---------
p1 10 2016-11-01
p1 15 2016-11-02
p2 14 2016-11-01
.
.
p1 70 2016-11-30
p2 50 2016-11-30
結果は、私たちが毎月の前半と後半に配置されたクライアントの平均数を表示する必要がthis.meansようにする必要があります。
TEMPBIWEEKLYCENSUS
テーブル:
Provider Avg(activeclients) Biweeklyrange
-------- ----------------- -------------
p1 30 11/01-11/15
p2 20 11/01-11/15
p1 40 11/15-11/30
p2 30 11/15-11/30
私は、開始日と現在の終了日の値を更新results.andを表示するには、ループしながら、使用しています。例:11月上旬、開始日= 11/01、現在終了日= 11/15の場合
終了日=月末。
これはコードです:
DECLARE @STARTDATE DATETIME
DECLARE @ENDDATE DATETIME
DECLARE @CURRENTENDDATE DATETIME
DECLARE @MONTHLASTDATE DATETIME
DECLARE @DAYSTOADD INT
DECLARE @TEMPSTARTDATE DATETIME
SET @STARTDATE= CONVERT(DATE, DATEADD(DAY, [email protected]*15,GETDATE()))
--PRINT @STARTDATE
SET @STARTDATE = DATEADD(MONTH,DATEDIFF(MONTH, 0, @STARTDATE),0)
--PRINT @STARTDATE
SET @ENDDATE = CONVERT(DATE,DATEADD(MONTH,1,GETDATE()))
SET @ENDDATE = DATEADD(DAY, -1, DATEADD(MONTH, DATEDIFF(MONTH, 0, @ENDDATE),0))
--PRINT @ENDDATE
DECLARE @TEMPBIWEEKLYCENSUS table (ProviderName NVARCHAR(500), ActiveClients INT, BiWeeklyRange NVARCHAR(50) );
-- SET @MONTHLASTDATE =DATEADD(DAY,-1, DATEADD(MONTH,1,@STARTDATE))
WHILE (@STARTDATE <= @ENDDATE)
BEGIN
SET @MONTHLASTDATE = DATEADD(DAY, -1, DATEADD(MONTH, 1, DATEADD(MONTH, DATEDIFF(MONTH, 0, @STARTDATE), 0)))
-- PRINT DATEDIFF(DAY,@STARTDATE, @MONTHLASTDATE)
IF DATEDIFF(DAY, @STARTDATE, @MONTHLASTDATE) > 15
BEGIN
IF DATEDIFF(DAY, @STARTDATE, @MONTHLASTDATE)/2 = 15
BEGIN
SET @DAYSTOADD = 15
END
ELSE
BEGIN
SET @DAYSTOADD = 14
END
END
ELSE IF DATEDIFF(DAY, @STARTDATE, @MONTHLASTDATE) < 15
BEGIN
SET @DAYSTOADD = DATEDIFF(DAY,@STARTDATE, @MONTHLASTDATE)
END
SET @CURRENTENDDATE = CONVERT(DATE,DATEADD(DAY,@DAYSTOADD,@STARTDATE))
--PRINT '**************************************'
--PRINT 'STARTDATE'
--PRINT @STARTDATE
--PRINT 'CURRENTENDDATE'
--PRINT @CURRENTENDDATE
--PRINT '**************************************'
INSERT INTO @TEMPBIWEEKLYCENSUS
SELECT
[ProviderName],
AVG(ActiveClients),
CONVERT(VARCHAR(10), DATEPART(MONTH, @STARTDATE)) + '/' + CONVERT(VARCHAR(10), DATEPART(DAY, @STARTDATE)) + '-' + CONVERT(VARCHAR(10), DATEPART(MONTH, @CURRENTENDDATE)) + '/' + CONVERT(VARCHAR(10), DATEPART(DAY, @CURRENTENDDATE))
FROM
[dbo].[DailyClientPopulation]
WHERE
CONVERT(DATE, DateAdded) >= @STARTDATE
AND CONVERT(DATE, DateAdded) <= @CURRENTENDDATE
GROUP BY
ProviderName
SET @STARTDATE = CONVERT(DATE,DATEADD(DAY,1,@CURRENTENDDATE))
END
SELECT
ProviderName, ActiveClients, BiWeeklyRange
FROM
@TEMPBIWEEKLYCENSUS
あなたは、このwhileループを削除し、アプローチベースを設定するコードを変換する方法を提案してくださいでした。
私はSQL Serverを使用していると仮定していますが、私は、日付関数は、範囲を隔週に数ヶ月を分割する方法を示すために一時テーブルにサンプルデータの数ヶ月を追加していますか?それ以降のバージョンでは日付/時刻機能が強化されています。 –
また、15日目はいつも切れていますか?または、その月の日に基づいて移動しますか? 2月は14日ですか?乾杯。 –
要件に応じて、開始および終了パラメータに基づく集計テーブルを使用して日付のテーブルを生成することができます。 – SMM