将每月固定值拆分为每天和国家/地区

时间:2021-01-14 14:42:30

标签: mysql sql

DB-Fiddle

CREATE TABLE sales (
    id int auto_increment primary key,
    country VARCHAR(255),
    sales_date DATE,
    sales_volume INT,
    fix_costs INT
);

INSERT INTO sales
(country, sales_date, sales_volume, fix_costs
)
VALUES 

("DE", "2020-01-03", "500", "0"),
("NL", "2020-01-03", "320", "0"),
("FR", "2020-01-03", "350", "0"),
("None", "2020-01-31", "0", "2000"),

("DE", "2020-02-15", "0", "0"),
("NL", "2020-02-15", "0", "0"),
("FR", "2020-02-15", "0", "0"),
("None", "2020-02-29", "0", "5000"),

("DE", "2020-03-27", "180", "0"),
("NL", "2020-03-27", "670", "0"),
("FR", "2020-03-27", "970", "0"),
("None", "2020-03-31", "0", "4000");

预期结果:

sales_date   |   country    |   sales_volume   |     fix_costs
-------------|--------------|------------------|------------------------------------------
2020-01-03   |     DE       |       500        |     37.95  (= 2000/31 = 64.5 x 0.59)
2020-01-03   |     FR       |       350        |     26.57  (= 2000/31 = 64.5 x 0.41)
2020-01-03   |     NL       |       320        |      0.00
-------------|--------------|------------------|------------------------------------------
2020-02-15   |     DE       |         0        |     86.21  (= 5000/28 = 172.4 x 0.50)  
2020-02-15   |     FR       |         0        |     86.21  (= 5000/28 = 172.4 x 0.50)  
2020-02-15   |     NL       |         0        |      0.00
-------------|--------------|------------------|------------------------------------------    
2020-03-27   |     DE       |       180        |     20.20  (= 4000/31 = 129.0 x 0.16) 
2020-03-27   |     FR       |       970        |    108.84  (= 4000/31 = 129.0 x 0.84)   
2020-03-27   |     NL       |       670        |      0.00
-------------|--------------|------------------|-------------------------------------------

预期结果中的 fix_costs 列计算如下:

步骤 1) 获取每月 fix_costs 的每日费率。 (2000/31 = 64.5; 5000/29 = 172.4; 4000/31 = 129.0)
第 2 步) 根据国家 DEFRsales_volume 中的份额,将每日价值分给他们。
步骤 3) 如果 sales_volume0,每日费率会被拆分为 50/50DEFR,如您所见2020-12-02


为了实现这一点,我尝试使用此查询,但无法使其工作:

SELECT 
    sales_date, 
    country, 
    SUM(sales_volume),
       (CASE WHEN country = 'NL' THEN 0
             WHEN SUM(CASE WHEN country <> 'NL' THEN sales_volume END) OVER (PARTITION BY sales_date) > 0
             THEN ((f.fix_costs/ DAY(LAST_DAY(sales_date))) *
                   sales_volume / NULLIF(SUM(CASE WHEN country <> 'NL' THEN sales_volume END) OVER (PARTITION BY sales_date), 0)
                  )
             ELSE (f.fix_costs / DAY(LAST_DAY(sales_date))) * 1 / SUM(country <> 'NL') OVER (PARTITION by sales_date)
        END) AS imputed_fix_costs
FROM sales s

    CROSS JOIN
     (SELECT
      SUM(fix_costs) as fix_costs
      FROM sales
      WHERE country = 'None'
     ) f

WHERE country <> "None"
GROUP BY 1,2;

我需要在查询中修改什么才能达到预期的结果?

1 个答案:

答案 0 :(得分:0)

您需要修正 FROM 子句,因此您只包括每个月的固定成本:

FROM sales s CROSS JOIN
     (SELECT LAST_DAY(sales_date) as month_ld, SUM(fix_costs) as fix_costs
      FROM sales
      WHERE country = 'None'
      GROUP BY month_ld
     ) f
     ON f.month_ld = LAST_DAY(s.sales_date)
相关问题