sql >> Database teknologi >  >> RDS >> Mysql

Opdel fixværdi til lande baseret på daglig indtægtsandel

Som en starter:din aktuelle forespørgsel gør ikke, hvad du ønsker. Det ser ud til, at du faktisk har brug for et månedligt vinduessum på fix_costs . Så jeg ville tage udgangspunkt i:

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;
 

Dette giver:

salgsdato | land | sum(salgsvolumen) | fix_cost_per_day:--------- | :------ | ----------------:| ---------------:2020-01-03 | DE | 500 | 64.51612020-01-03 | FR | 350 | 64.51612020-01-03 | NL | 320 | 64.51612020-01-30 | Ingen | 0 | 64.51612020-02-15 | DE | 700 | 172.41382020-02-15 | FR | 180 | 172.41382020-02-15 | NL | 420 | 172.41382020-02-29 | Ingen | 0 | 172.41382020-03-27 | DE | 180 | 129.03232020-03-27 | FR | 970 | 129.03232020-03-27 | NL | 670 | 129.03232020-03-31 | Ingen | 0 | 129.0323

Derfra kan du tilføje logikken, der tager højde for den "daglige indtægtsandel pr. land". Som jeg forstår dit spørgsmål, er det:

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;
 

Returnerer:

salgsdato | land | sum(salgsvolumen) | fix_cost_per_day:--------- | :------ | ----------------:| ---------------:2020-01-03 | DE | 500 | 27.570995312020-01-03 | FR | 350 | 19.299696722020-01-03 | NL | 320 | 17.645437002020-01-30 | Ingen | 0 | null 2020-02-15 | DE | 700 | 92.838196292020-02-15 | FR | 180 | 23.872679052020-02-15 | NL | 420 | 55.702917772020-02-29 | Ingen | 0 | null 2020-03-27 | DE | 180 | 12.761432122020-03-27 | FR | 970 | 68.769939742020-03-27 | NL | 670 | 47.500886212020-03-31 | Ingen | 0 | null

Demo på DB Fiddle

Hvis det er nødvendigt, kan du fjerne registreringerne for landet 'None' ved at omdanne forespørgslen til en underforespørgsel og filtrere en ydre forespørgsel ind.



  1. Postgres INTERVAL ved hjælp af værdi fra tabel

  2. MySQL:Vælg alle datoer mellem datointerval og få tabeldata, der matcher datoer

  3. Databasedesign til revisionslogning

  4. OPRET Oracle-procedure