SQL - объединить 2 таблицы и рассчитать промежуточную сумму (месяц к дате) - PullRequest
0 голосов
/ 14 мая 2019

Есть 2 таблицы:
enter image description here

enter image description here

Необходимо объединить эти 2 таблицы с одним и тем же идентификатором и на определенную дату - чтобы показать общую сумму (сумму) с начала того же месяца до (включая) дату из первой таблицы.

Результат должен быть:
enter image description here

Я сделал одну часть (для промежуточной суммы), но еще не все:

  select 
        date_a, a.id,
        sum(b.AMOUNT) over (partition by b.ID, to_varchar(b.ID::date, 'yyyy-mm') 
        order by b.ID) 
        as AMOUNT_MONTH_TO_DATE  
    FROM 
        a
    inner join
        b
    on 
        a.id = b.id

Ответы [ 2 ]

1 голос
/ 14 мая 2019

Согласно вашему объяснению, abc2 также должен возвращать 0, но вы показали 10 в ожидаемом результате. Причина в том, что date_b больше, чем date_a, и для abc2 ничего не следует выбирать для логики date_b между «Start Date of month» и «Date_a». Если я прав, следующий запрос будет работать -

SELECT 
A.id,
A.date_a,
COALESCE
(
    (
        SELECT 
        SUM(amount) 
        FROM TABLE_2 B 
        WHERE B.id = A.id 
        AND B.date_b BETWEEN DATEADD(DD,-(DAY(date_a)-1),date_a) AND  A.date_A
    )
    ,0
)
FROM TABLE_1 A

Тот же вывод может быть достигнут с помощью LEFT JOIN-

SELECT 
A.id,
A.date_a,
COALESCE(SUM(B.amount),0) total_amount
FROM table_1 A
LEFT JOIN table_2 B ON B.id = A.id 
    AND B.date_b BETWEEN DATEADD(DD,-(DAY(A.date_a)-1),date_a) AND  A.date_A
GROUP BY A.id,A.date_a
0 голосов
/ 14 мая 2019

Если total_amount во втором ряду ожидаемого результата не было ошибкой, это должно сделать это:

SELECT date_a,
       a.id,
       SUM(IF(date_b <= date_a AND MONTH(date_b)=MONTH(date_a),amount,0)) AS total_amount 
    FROM a 
    INNER JOIN b 
       ON a.id=b.id 
GROUP BY date_a, a.id
ORDER BY date_a DESC;
...