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
,如您在预期结果中所见。我该如何修改查询才能实现此目的?
答案 0 :(得分: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;
sales_date | country | sum(sales_volume) | fix_cost_per_day :--------- | :------ | ----------------: | ---------------: 2020-01-03 | DE | 500 | 37.95066414 2020-01-03 | FR | 350 | 26.56546490 2020-01-03 | NL | 320 | null 2020-01-30 | None | 0 | null 2020-02-15 | DE | 700 | 137.14733542 2020-02-15 | FR | 180 | 35.26645768 2020-02-15 | NL | 420 | null 2020-02-29 | None | 0 | null 2020-03-27 | DE | 180 | 20.19635344 2020-03-27 | FR | 970 | 108.83590463 2020-03-27 | NL | 670 | null 2020-03-31 | None | 0 | null
答案 1 :(得分:0)
只需使用条件聚合:
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;