Получить сумму значений колонки таблицы, сравнивая дату с датой из другой таблицы

Есть таблицы:

Table1

Id| Val | Date
 1|  3  | 2020-03-10 00:00:00
 2|  9  | 2020-02-23 00:00:00
 3|  4  | 2020-02-25 00:00:00
 4|  5  | 2020-03-14 00:00:00

Table2

SomeDate
2020-02-28 00:00:00
2020-03-31 00:00:00

Пытаюсь написать запрос, который будет брать каждую дату из Table2 по очереди, по ней находить записи в Table1, где Table1.Date < Table2.SomeDate, и суммировать значения колонки Val.

В результате должны быть записи с 2-мя колонками - sum(Table1.Val), Table2.SomeDate:

sum(Table1.Val) | Table2.SomeDate
     13         | 2020-02-28 00:00:00
     21         | 2020-03-31 00:00:00

Думал, что должно быть что-то вроде:

select sum(t1.val), t2.SomeDate 
from Table1 t1, Table2 t2
where t1.Date < t2.SomeDate

Но запрос не рабочий.


Ответы (1 шт):

Автор решения: 0xdb

Запрос в принципе правильный, но его надо немного поправить:

  • нельзя именовать колонки в таблицах зарезервироваными ключевыми словами (date в данном случае)
  • надо включать в GROUP BY колонки, которые в листе выборки и не являются параметрами агрегирующих функций

Итого, такой запрос рабочий:

select sum(t1.val) sumval, t2.SomeDt 
from t1, t2
where t1.Dt < t2.SomeDt
group by t2.SomeDt 

Если версия 12.01 или позднее, то эффективней будет с кореляционным запросом:

select sumval, t2.SomeDt 
from t2 
cross apply (
    select sum (t1.val) sumval
    from t1
    where t1.Dt < t2.SomeDt)

Оба запроса дадут желаемый результат:

    SUMVAL SOMEDT             
---------- -------------------
        13 2020-02-28 00:00:00
        21 2020-03-31 00:00:00

CTE с тестовыми данными для примеров выше:

with t1 (Id, Val, Dt) as ( 
    select 1,  3,  date'2020-03-10' from dual union all
    select 2,  9,  date'2020-02-23' from dual union all
    select 3,  4,  date'2020-02-25' from dual union all
    select 4,  5,  date'2020-03-14' from dual
), t2 (SomeDt) as (
    select date'2020-02-28' from dual union all
    select date'2020-03-31' from dual
) 
[здесь вставить сам запрос]
→ Ссылка