Mysql
 sql >> база данни >  >> RDS >> Mysql

Разделете фиксираната стойност на държави въз основа на дневния дял от приходите

Като начало:вашата currenet заявка не прави това, което искате. Изглежда, че всъщност се нуждаете от месечна сума на прозореца за fix_costs . Така че бих започнал от:

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;
 

Това дава:

<предварителна>дата_на_продажба | държава | сума(обем_продажби) | 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 | Няма | 0 | 64.51612020-02-15 | DE | 700 | 172.41382020-02-15 | FR | 180 | 172.41382020-02-15 | NL | 420 | 172.41382020-02-29 | Няма | 0 | 172.41382020-03-27 | DE | 180 | 129.03232020-03-27 | FR | 970 | 129.03232020-03-27 | NL | 670 | 129.03232020-03-31 | Няма | 0 | 129,0323

Оттам нататък можете да добавите логиката, която отчита „дневния дял от приходите по държава“. Както разбирам въпроса ви, това е:

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;
 

Връща:

<предварителна>дата_на_продажба | държава | сума(обем_продажби) | 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 | Няма | 0 | нула 2020-02-15 | DE | 700 | 92.838196292020-02-15 | FR | 180 | 23.872679052020-02-15 | NL | 420 | 55.702917772020-02-29 | Няма | 0 | нула 2020-03-27 | DE | 180 | 12.761432122020-03-27 | FR | 970 | 68.769939742020-03-27 | NL | 670 | 47.500886212020-03-31 | Няма | 0 | нула

Демо на DB Fiddle

Ако е необходимо, можете да премахнете записите за държава 'None' като превърнете заявката в подзаявка и филтрирате във външна заявка.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Mysql Средна колона за време?

  2. MySQLi не успява да подготви изявление

  3. Премахване на дублиращи се редове в MySQL

  4. MySQL:вмъкване на стойности от друга таблица в една колона

  5. Не може да се свърже с MySQL сървър грешка 111