Получить секционированную сумму столбца в фиксированном временном окне для каждой записи - PullRequest
0 голосов
/ 26 июня 2018
TelNo   | OrderDate     | Orders  
A       | 2017-01-01    | 5  
A       | 2017-02-02    | 4  
A       | 2017-07-05    | 6  
A       | 2017-09-10    | 10  
B       | 2017-03-01    | 3  
B       | 2017-04-12    | 6  
B       | 2017-11-10    | 4  

Выше приведена таблица заказов, необходимо найти сумму «Orders» для каждого «TelNo» в течение последних 6 месяцев с «OrderDate» для каждой записи таблицы. Ниже ожидаемый результат;

TelNo   | OrderDate     | Sum_of_orders  
A       | 2017-01-01    | 5  
A       | 2017-02-02    | 9  
A       | 2017-07-05    | 10  
A       | 2017-09-10    | 16  
B       | 2017-03-01    | 3  
B       | 2017-04-12    | 9  
B       | 2017-11-10    | 4  

Я пробовал разные комбинации подходов CTE и sum (case -) over (partition by -) (sql-server-2016), но не нашел решения. Ценю, если кто-то может помочь в этом.

Ответы [ 3 ]

0 голосов
/ 26 июня 2018

Я бы использовал apply:

select t.TelNo, t.OrderDate, tt.Sum_of_orders  
from table t cross apply (
     select sum(t1.orders) Sum_of_orders
     from table t1
     where t1.TelNo = t.TelNo and
           t1.OrderDate >= dateadd(mm, -6, t.orderdate) and 
           t1.OrderDate <= t.OrderDate
) tt;
0 голосов
/ 26 июня 2018

Вы можете использовать запрос ниже, чтобы получить желаемые результаты:

select mt.TelNo, mt.OrderDate, sum(mt1.orders) from MyTbl mt
left join MyTbl mt1 on mt.TelNo = mt1.TelNo and datediff(day,mt1.OrderDate, mt.OrderDate) <= 180
and mt1.orderdate <= mt.OrderDate
Group by mt.TelNo, mt.OrderDate
order by 1,2
0 голосов
/ 26 июня 2018

Вы можете использовать запрос как ниже, чтобы получить желаемые результаты См. Рабочую демонстрацию

select t1.TelNo, t1.OrderDate, Sum_of_orders  =sum(t2.Orders)
from t t1
join t t2
on t1.TelNo=t2.Telno 
and t2.OrderDate between DATEADD(m,-6,t1.OrderDate) and t1.OrderDate
group by t1.TelNo, t1.OrderDate
...