Получить сумму значений колонки таблицы, сравнивая дату с датой из другой таблицы
Есть таблицы:
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
)
[здесь вставить сам запрос]