У меня есть эта таблица, которая отображает поставщиков и активных активных клиентов в каждый день.Заменить цикл while на основе набора в SQL Server
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/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
Не могли бы вы подсказать, как убрать это время цикла и преобразовывать код для установки на основе подхода.
Я предполагаю, что вы используете SQL Server, но какую версию? Более поздние версии имеют улучшенные функции даты и времени, которые могут помочь. –
Кроме того, это 15-й всегда отрезанный? Или он перемещается в зависимости от дней в месяце, например. для февраля это 14-й? Приветствия. –
В зависимости от требований таблица дат может быть сгенерирована таблицей таблиц на основе начальных и конечных параметров. – SMM