SQL - динамическая сумма, основанная на динамическом диапазоне дат - PullRequest
0 голосов
/ 10 декабря 2018

Я новичок в SQL, и я даже не уверен, возможно ли то, что я пытаюсь достичь.

У меня есть две таблицы.Первый дает номер счета, дату «от» и дату «до».Вторая таблица показывает ежемесячный объем для каждой учетной записи.

Table 1 - Dates
Account#  Date_from   Date_to
--------  ---------   -------
123       2018-01-01  2018-12-10
456       2018-06-01  2018-12-10
789       2018-04-23  2018-11-01

Table 2 - Monthly_Volume
Account#   Date         Volume
---------  ----------   ------
123        2017-12-01   5
123        2018-01-15   5
123        2018-02-05   5
456        2018-01-01   10
456        2018-10-01   15
789        2017-06-01   5
789        2018-01-15   10
789        2018-06-20   7

Я хотел бы объединить две таблицы таким образом, чтобы каждая учетная запись в Таблице 1 имела четвертый столбец, в котором приводится сумма объема между Date_from иDate_to.

Desired Result:
Account#  Date_from   Date_to     Sum(Volume)
--------  ---------   -------     -----------
123       2018-01-01  2018-12-10  10
456       2018-06-01  2018-12-10  15
789       2018-04-23  2018-11-01  7

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

SELECT
    Account#, 
    SUM(Volume)
FROM Monthly_Volume
WHERE 
    Account# = '123'
    AND Date_from >= TO_DATE('2018-01-01', 'YYYY-MM-DD')
    AND Date_to <= TO_DATE('2018-12-10', 'YYYY-MM-DD') 
GROUP BY Account#

Что яХотелось бы узнать, возможно ли достичь этого без необходимости индивидуального заполнения Account Number, Date_from и Date_to для каждой учетной записи (существует ~ 1000 учетных записей), но нужно ли это делать автоматически для каждой записи в таблице Dates.

Спасибо!

1 Ответ

0 голосов
/ 10 декабря 2018

Вы должны использовать join и group by:

select d.account#, d.Date_from, d.Date_to, sum(mv.volume)
from dates d left join
     monthly_volume mv
     on mv.account# = d.account# and
        mv.date between d.Date_from and d.Date_to
group by d.account#, d.Date_from, d.Date_to;
...