DB-Fiddle CREATE TABLE sales (id SERIAL PRIMARY KEY, VARCHAR страны (255), sales_date DATE, sales_volume DECIMAL, fix_costs DECIMAL); ВСТАВИТЬ продажи (страна, дата_продажи, ...

1
Michi 3 Мар 2021 в 17:33

1 ответ

Лучший ответ

Если я правильно понимаю, вы хотите определить пропорциональные фиксированные расходы в день для всех стран, кроме Нидерландов:

select s.*,
       (case when country = 'NL' then 0
             when sum(sales_volume) over (partition by sales_date) = 0
             then (fix_costs / datepart(day, last_day(sales_date))) * 1.0 / sum(case when country <> 'NL' then 1 else 0 end) over (partition by sales_date)
             else (fix_costs / datepart(day, last_day(sales_date))) * (sales_volume / sum(case when country <> 'NL' then sales_volume end) over (partition by sales_date))
        end) as apportioned_fix_costs
from sales s
where country <> 'None';

Примечание. Похоже, вы не хотите, чтобы None в ваших результатах, поэтому он просто отфильтровывается. Тогда все остальные данные кажутся одними данными за месяц. Если это действительно может быть для нескольких данных, используйте date_trunc() в предложении partition by.

Для справки: Postgres не поддерживает last_day(). Вы можете использовать выражение:

select extract(day from date_trunc('month', sales_date) + interval '1 month' - interval '1 day')

DB- Fiddle

1
Michi 3 Мар 2021 в 15:49