SQL Как бы я показал скользящее среднее значение за 3 месяца для этого запроса - PullRequest
0 голосов
/ 24 февраля 2020

Нужна помощь по математике с этим кусочком кода. Вы можете видеть, что мне нужна помощь еще больше! Но любая помощь, которую вы мне могли бы оказать, была бы великолепна - AccountID, - что-то под названием SPID, которых может быть несколько в учетной записи, - Дата выставления счета - Сумма счета на соответствующую дату выставления счета - Тогда Среднее за 3 месяца

Последняя часть - это то, что я У меня проблема с

До сих пор я сделал это

Select 
t3.AccountID,
t3.SPID,
t2.BilledDate,
Amount = Sum (t1.Amount)

From dbo.table1 t1
Inner Join dbo.table2 t2
On t1.item1 = t2.item2

Inner Join Table3 t3 
On t2.Item1 = t3.item3

Where AccountID In (xxxxxxx)
And t2.BilledDate >= '20190401' 

Group By 
AccountID
,t3.spid
,t2.BilledDate
,t1.Discount

Теперь это дает мне необработанные данные как так (извинения, не уверен, что здесь показывать, если кто-то может попросить было бы неплохо отредактировать);

 AccountID  SPID    BilledDate  Amount
xxx930  xxxxx1  05/04/2019  11.81
xxx930  xxxxx2  07/05/2019  11.01
xxx930  xxxxx3  06/06/2019  11.38
xxx930  xxxxx4  04/07/2019  11.01
xxx930  xxxxx5  06/08/2019  11.38
xxx930  xxxxx6  06/09/2019  11.38
xxx930  xxxxx7  04/10/2019  11.01
xxx930  xxxxx8  06/11/2019  11.38
xxx930  xxxxx9  04/12/2019  11.01
xxx930  xxxxx10 07/01/2020  11.38

Однако в конце я хотел бы получить столбец, в котором будет отображаться среднее значение расходов за предыдущие 3 месяца

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

любой совет или помощь будет отличным

Заранее спасибо

Ответы [ 2 ]

1 голос
/ 24 февраля 2020

Я думаю, apply - ваша лучшая ставка, потому что у вас, кажется, нет одной строки на счет и месяц:

with t as (
      <your query here>
     ) 
select t.*, tt.running_amount_3
from t outer apply
     (select avg(t2.amount) as running_amount_3
      from t t2
      where t2.AccountID = t.AccountID and
            t2.BilledDate <= t.BilledDate and
            t2.BilledDate > dateadd(month, -3, t.BilledDate)
     ) tt;
1 голос
/ 24 февраля 2020

Если всегда будет строка, то кажется, что проще всего было бы с функцией windows AVG. Используя значения конечного сэмпла, у вас есть:

SELECT V.AccountID,
       V.SPID,
       V.BilledDAte,
       V.Amount,
       AVG(V.Amount) OVER (PARTITION BY V.AccountID ORDER BY V.BilledDate
                           ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) AS Last3Average
FROM (VALUES('xxx930','xxxxx1 ',CONVERT(date,'05/04/2019'),11.81),
            ('xxx930','xxxxx2 ',CONVERT(date,'07/05/2019'),11.01),
            ('xxx930','xxxxx3 ',CONVERT(date,'06/06/2019'),11.38),
            ('xxx930','xxxxx4 ',CONVERT(date,'04/07/2019'),11.01),
            ('xxx930','xxxxx5 ',CONVERT(date,'06/08/2019'),11.38),
            ('xxx930','xxxxx6 ',CONVERT(date,'06/09/2019'),11.38),
            ('xxx930','xxxxx7 ',CONVERT(date,'04/10/2019'),11.01),
            ('xxx930','xxxxx8 ',CONVERT(date,'06/11/2019'),11.38),
            ('xxx930','xxxxx9 ',CONVERT(date,'04/12/2019'),11.01),
            ('xxx930','xxxxx10',CONVERT(date,'07/01/2020'),11.38))V(AccountID,SPID, BilledDate,Amount);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...