sql >> Databasteknik >  >> RDS >> Mysql

Dela fast värde till länder baserat på daglig intäktsandel

Till att börja med:din aktuella fråga gör inte vad du vill. Det verkar som att du faktiskt behöver en månatlig fönstersumma på fix_costs . Så jag skulle utgå från:

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;
 

Detta ger:

försäljningsdatum | land | summa(försäljningsvolym) | fix_kostnad_per_dag:--------- | :------ | ----------------:| ---------------:2020-01-03 | DE | 500 | 64.51612020-01-03 | FR | 350 | 64.51612020-01-03 | NL | 320 | 64.51612020-01-30 | Inga | 0 | 64.51612020-02-15 | DE | 700 | 172.41382020-02-15 | FR | 180 | 172.41382020-02-15 | NL | 420 | 172.41382020-02-29 | Inga | 0 | 172.41382020-03-27 | DE | 180 | 129.03232020-03-27 | FR | 970 | 129.03232020-03-27 | NL | 670 | 129.03232020-03-31 | Inga | 0 | 129,0323

Därifrån kan du lägga till logiken som tar hänsyn till "den dagliga inkomstandelen per land". Som jag förstår din fråga är 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;
 

Returnerar:

försäljningsdatum | land | summa(försäljningsvolym) | fix_kostnad_per_dag:--------- | :------ | ----------------:| ---------------:2020-01-03 | DE | 500 | 27.570995312020-01-03 | FR | 350 | 19.299696722020-01-03 | NL | 320 | 17.645437002020-01-30 | Inga | 0 | null 2020-02-15 | DE | 700 | 92.838196292020-02-15 | FR | 180 | 23.872679052020-02-15 | NL | 420 | 55.702917772020-02-29 | Inga | 0 | null 2020-03-27 | DE | 180 | 12.761432122020-03-27 | FR | 970 | 68.769939742020-03-27 | NL | 670 | 47.500886212020-03-31 | Inga | 0 | null

Demo på DB Fiddle

Om det behövs kan du ta bort posterna för landet 'None' genom att vända frågan till en underfråga och filtrera in en yttre fråga.



  1. SUM(subquery) i MYSQL

  2. MySqli:är det möjligt att skapa en databas?

  3. Söker efter datumintervallkonflikter i MySQL

  4. CodeIgniter:Hur man gör en Select (Distinct Fieldname) MySQL-fråga