【问题标题】:Exclude certain values when splitting a fix value to countries based on a daily revenue share根据每日收入分成将固定值拆分到国家/地区时排除某些值
【发布时间】:2020-11-09 19:31:00
【问题描述】:

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-30", "0", "2000"),

("DE", "2020-02-15", "700", "0"),
("NL", "2020-02-15", "420", "0"),
("FR", "2020-02-15", "180", "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 * 0.59)
2020-01-03        FR              350           26.57  (=2000/31 = 64.5 * 0.41)
2020-01-03        NL              320            0.00
2020-02-15        DE              700          137.15  (=5000/29 = 172.4 * 0.8)   
2020-02-15        FR              180           35.27  (=5000/29 = 172.4 * 0.2)  
2020-02-15        NL              420            0.00    
2020-03-27        DE              180           20.20  (=4000/31 = 129.0 * 0.16) 
2020-03-27        FR              970          108.81  (=4000/31 = 129.0 * 0.84)   
2020-03-27        NL              670            0.00

参考this question 中的解决方案,我目前使用以下查询将monthly 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)) 
        * sum(sales_volume)
        / sum(sum(sales_volume)) over(partition by sales_date)
        as fix_cost_per_day
from sales
group by 1,2;

这一切都很好。


但是,现在我希望该国家/地区 NL 被排除在 share_calculation 之外,并且始终保持为 0,正如您在预期结果中看到的那样。我必须如何修改查询才能实现这一点?

【问题讨论】:

    标签: mysql sql sum mariadb window-functions


    【解决方案1】:

    您可以使用case 表达式,围绕计算和窗口sum

    select 
        sales_date, 
        country, 
        sum(sales_volume),
        case when country <> 'NL'
            then sum(sum(fix_costs)) over(partition by year(sales_date), month(sales_date))
                / day(last_day(sales_date)) 
                * sum(sales_volume)
                / sum(case when country <> 'NL' then sum(sales_volume) else 0 end) over(partition by sales_date)
        else 0
        end as fix_cost_per_day
    from sales
    group by 1,2;
    

    Demo on DB Fiddle

    销售日期 |国家 |总和(销售量) | fix_cost_per_day :--------- | :-------- | ----------------: | ---------------: 2020-01-03 |德 | 500 | 37.95066414 2020-01-03 |法语 | 350 | 26.56546490 2020-01-03 |荷兰 | 320 | 2020-01-30 |无 | 0 | 2020-02-15 |德 | 700 | 137.14733542 2020-02-15 |法语 | 180 | 35.26645768 2020-02-15 |荷兰 | 420 | 2020-02-29 |无 | 0 | 2020-03-27 |德 | 180 | 20.19635344 2020-03-27 |法语 | 970 | 108.83590463 2020-03-27 |荷兰 | 670 | 2020-03-31 |无 | 0 |

    【讨论】:

      【解决方案2】:

      只使用条件聚合:

      select 
          sales_date, 
          country, 
          sum(sales_volume),
          (case when country = 'NL' then 0
                else sum(sum(case when country = 'NL' then 0 else fix_costs end)) 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)
           end)  as fix_cost_per_day
      from sales
      group by 1,2;
      

      【讨论】:

        猜你喜欢
        • 2020-11-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-02
        • 2018-02-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多