Данные за последние 12 месяцев каждого месяца с последующими 12 месяцами - PullRequest
0 голосов
/ 11 июля 2019

Это TSQL, и я пытаюсь рассчитать частоту повторных покупок за последние 12 месяцев. Это достигается путем просмотра суммы клиентов, которые купили более 1 раза за последние 12 месяцев, и общего количества клиентов за последние 12 месяцев. Код SQL ниже даст мне именно это; но я хотел бы динамически делать это в течение последних 12 месяцев. Это та часть, где я застрял и не должен, как лучше всего достичь этого. Каждый месяц должен включать данные за 12 месяцев. То есть В июне должны храниться данные с июня 2018 года по июнь 2018 года, в мае должны храниться данные с мая 2018 года по май 2019 года.

[Дата заказа] - обычное поле даты (гггг-мм-дд чч: мм: сс)

DECLARE @startdate1 DATETIME
DECLARE @enddate1 DATETIME

SET @enddate1 = DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE())-1, 0) -- Starting June 2018
SET @startdate1 = DATEADD(mm,DATEDIFF(mm,0,GETDATE())-13,0) -- Ending June 2019
;

with dataset as (
select [Phone No_] as who_identifier,
count(distinct([Order No_])) as mycount
from [MyCompany$Sales Invoice Header]
where [Order Date] between @startdate1 and @enddate1
group by [Phone No_]
),

frequentbuyers as (
select who_identifier, sum(mycount) as frequentbuyerscount
from dataset
where mycount > 1
group by who_identifier),

allpurchases as (
select who_identifier, sum(mycount) as allpurchasescount
from dataset
group by who_identifier
)

select sum(frequentbuyerscount) as frequentbuyercount, (select sum(allpurchasescount) from allpurchases) as allpurchasecount
from frequentbuyers

Я надеюсь достичь конечного результата, примерно так: ... Декабрь, январь, февраль, март, апрель, май, июнь каждого месяца содержат оба значения: для частых покупок и всех покупок.

1 Ответ

0 голосов
/ 11 июля 2019

Вот код.Я сделал небольшую модификацию для частых покупателей и всех покупок.Если вы используете выражение типа sumif, вам не нужен второй cte.

if object_id('tempdb.dbo.#tmpMonths') is not null drop table #tmpMonths
create table #tmpMonths ( MonthID datetime, StartDate datetime, EndDate datetime)

declare @MonthCount int = 12
declare @Month datetime = DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()), 0)

while @MonthCount > 0 begin
    insert into #tmpMonths( MonthID, StartDate, EndDate )
    select @Month, dateadd(month, -12, @Month), @Month
    set @Month = dateadd(month, -1, @Month)
    set @MonthCount = @MonthCount - 1
end


;with dataset as (
    select m.MonthID as MonthID, [Phone No_] as who_identifier,
    count(distinct([Order No_])) as mycount
    from [MyCompany$Sales Invoice Header]
    inner join #tmpMonths m on [Order Date] between m.StartDate and m.EndDate
    group by m.MonthID, [Phone No_]
    ),
buyers as (
    select MonthID, who_identifier
        , sum(iif(mycount > 1, mycount, 0)) as frequentbuyerscount --sum only if count > 1
        , sum(mycount) as allpurchasescount
    from dataset
    group by MonthID, who_identifier
    )
select 
    b.MonthID
    , max(tm.StartDate) StartDate, max(tm.EndDate) EndDate
    , sum(b.frequentbuyerscount) as frequentbuyercount
    , sum(b.allpurchasescount) as allpurchasecount
from buyers b inner join #tmpMonths tm on tm.MonthID = b.MonthID
group by b.MonthID

Имейте в виду, что код был протестирован только с синтаксисом.

После тестовых данных этоэто результат:

 MonthID   | StartDate  | EndDate    | frequentbuyercount | allpurchasecount
-----------------------------------------------------------------------------
2018-08-01 | 2017-08-01 | 2018-08-01 | 340                | 3702
2018-09-01 | 2017-09-01 | 2018-09-01 | 340                | 3702
2018-10-01 | 2017-10-01 | 2018-10-01 | 340                | 3702
2018-11-01 | 2017-11-01 | 2018-11-01 | 340                | 3702
2018-12-01 | 2017-12-01 | 2018-12-01 | 340                | 3703
2019-01-01 | 2018-01-01 | 2019-01-01 | 340                | 3703
2019-02-01 | 2018-02-01 | 2019-02-01 | 2                  | 8
2019-03-01 | 2018-03-01 | 2019-03-01 | 2                  | 3
2019-04-01 | 2018-04-01 | 2019-04-01 | 2                  | 3
2019-05-01 | 2018-05-01 | 2019-05-01 | 2                  | 3
2019-06-01 | 2018-06-01 | 2019-06-01 | 2                  | 3
2019-07-01 | 2018-07-01 | 2019-07-01 | 2                  | 3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...