PostgresSQL Запрос на включение итогов с начала года, например, SUMIFS? - PullRequest
0 голосов
/ 24 марта 2020

Заранее спасибо за любую помощь. Написание запросов, безусловно, моя самая большая слабость.

У меня есть запрос, написанный для получения данных о транзакциях для каждого клиента в каждый день:

select organization, 
       DATE(txn_date), 
       sum(amount) as totalamount 
from sales_receipt 
where EXTRACT(YEAR from txn_date) > 2017 
group by organization, DATE(txn_date)

Это дает что-то вроде:

organization date        totalamount
client1      2018-01-01  1000.00  
client1      2018-01-02  500.00    
client1      2018-01-03  800.00  
client2      2018-01-01  600.00  
client2      2018-01-02  300.00    
client2      2018-01-03  200.00
client1      2019-01-01  800.00
client1      2019-01-02  600.00    
client1      2019-01-03  900.00
client2      2019-01-01  400.00  
client2      2019-01-02  600.00
client2      2019-01-03  800.00

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

organization date        totalamount ytd 
client1      2018-01-01  1000.00     1000.00  
client1      2018-01-02  500.00      1500.00    
client1      2018-01-03  800.00      2300.00
client2      2018-01-01  600.00      600.00  
client2      2018-01-02  300.00      900.00
client2      2018-01-03  200.00      200.00
client1      2019-01-01  800.00      8000.00  
client1      2019-01-02  600.00      1400.00    
client1      2019-01-03  900.00      2300.00
client2      2019-01-01  400.00      400.00  
client2      2019-01-02  600.00      1000.00
client2      2019-01-03  800.00      1800.00

Есть ли способ сделать это в PostgreSQL запрос?

Ответы [ 2 ]

1 голос
/ 24 марта 2020

Я бы написал так:

select 
    organization, 
    txn_date::date txn_date, 
    sum(amount) as totalamount,
    sum(sum(amount)) over(partition by organization, extract(year from txn_date) order by date) ytd
from sales_receipt 
where txn_date >= '2018-01-01'::date
group by organization, txn_date::date

Вам не нужен дополнительный уровень вложенности для использования оконных функций.

Кроме того, вам, похоже, нужен отдельный раздел для каждой организации и год.

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

1 голос
/ 24 марта 2020

Вы ищете промежуточный итог, который можно сделать с помощью оконной функции после существующей агрегации:

select organization, 
       txn_date, 
       totalamount, 
       sum(totalamount) over (partition by organization order by txn_date) as ytd
from (      
    select organization, 
           DATE(txn_date) as txn_date, 
           sum(amount) as totalamount, 
    from sales_receipt 
    where txn_date >= date '2018-01-01' -- this expression can make use of an index on txn_date
    group by organization, DATE(txn_date)
) t;
...