sql >> Database >  >> RDS >> Mysql

Vaste waarde splitsen naar landen op basis van dagelijks inkomstenaandeel

Om te beginnen:je huidige query doet niet wat je wilt. Het lijkt erop dat je eigenlijk een maandelijks vensterbedrag nodig hebt op fix_costs . Dus ik zou beginnen met:

select 
    sales_date, 
    country, 
    sum(sales_volume),
    sum(sum(fix_costs)) over(partition by year(sales_date), month(sales_date))
        / day(last_day(sales_date)) 
        as fix_cost_per_day
from sales
group by 1,2;

Dit levert:

sales_date | country | sum(sales_volume) | fix_cost_per_day
:--------- | :------ | ----------------: | ---------------:
2020-01-03 | DE      |               500 |          64.5161
2020-01-03 | FR      |               350 |          64.5161
2020-01-03 | NL      |               320 |          64.5161
2020-01-30 | None    |                 0 |          64.5161
2020-02-15 | DE      |               700 |         172.4138
2020-02-15 | FR      |               180 |         172.4138
2020-02-15 | NL      |               420 |         172.4138
2020-02-29 | None    |                 0 |         172.4138
2020-03-27 | DE      |               180 |         129.0323
2020-03-27 | FR      |               970 |         129.0323
2020-03-27 | NL      |               670 |         129.0323
2020-03-31 | None    |                 0 |         129.0323

Van daaruit kunt u de logica toevoegen die rekening houdt met het "dagelijkse inkomstenaandeel per land". Zoals ik uw vraag begrijp, is dat:

select 
    sales_date, 
    country, 
    sum(sales_volume),
    sum(sum(fix_costs)) over(partition by year(sales_date), month(sales_date))
        / day(last_day(sales_date)) 
        * sum(sales_volume)
        / sum(sum(sales_volume)) over(partition by sales_date)
        as fix_cost_per_day
from sales
group by 1,2;

Retourneren:

sales_date | country | sum(sales_volume) | fix_cost_per_day
:--------- | :------ | ----------------: | ---------------:
2020-01-03 | DE      |               500 |      27.57099531
2020-01-03 | FR      |               350 |      19.29969672
2020-01-03 | NL      |               320 |      17.64543700
2020-01-30 | None    |                 0 |             null
2020-02-15 | DE      |               700 |      92.83819629
2020-02-15 | FR      |               180 |      23.87267905
2020-02-15 | NL      |               420 |      55.70291777
2020-02-29 | None    |                 0 |             null
2020-03-27 | DE      |               180 |      12.76143212
2020-03-27 | FR      |               970 |      68.76993974
2020-03-27 | NL      |               670 |      47.50088621
2020-03-31 | None    |                 0 |             null

Demo op DB Fiddle

Indien nodig kunt u de records voor land 'None' . verwijderen door de query om te zetten in een subquery en in een buitenste query te filteren.



  1. MYSQL-tabel met statische waarden en dynamische waarden

  2. Programmatisch een tabel maken met MyBatis en MySql

  3. Kan ik in MySQL één rij kopiëren om in dezelfde tabel in te voegen?

  4. Maak verbinding met een online MySQL-database van localhost