根据每个国家/地区的预定义份额将固定价值拆分到国家/地区
Posted
技术标签:
【中文标题】根据每个国家/地区的预定义份额将固定价值拆分到国家/地区【英文标题】:Split fix value to countries based on pre-defined share per country 【发布时间】:2021-05-05 12:59:27 【问题描述】:DB-Fiddle
CREATE TABLE costs (
id SERIAL PRIMARY KEY,
event_date DATE,
country VARCHAR,
channel VARCHAR,
costs DECIMAL
);
INSERT INTO costs
(event_date, country, channel, costs)
VALUES
('2020-02-08', 'DE', 'channel_01', '400'),
('2020-02-08', 'DE', 'channel_02', '400'),
('2020-02-08', 'DE', 'channel_03', '400'),
('2020-02-08', 'FR', 'channel_01', '400'),
('2020-02-08', 'FR', 'channel_02', '400'),
('2020-02-08', 'NL', 'channel_01', '400'),
('2020-04-15', 'DE', 'channel_01', '300'),
('2020-04-15', 'FR', 'channel_01', '300'),
('2020-04-15', 'NL', 'channel_01', '300'),
('2020-04-15', 'NL', 'channel_02', '300'),
('2020-04-15', 'NL', 'channel_03', '300');
预期结果:
event_date | country | costs |
--------------|--------------|-----------------------------|---------
2020-02-08 | DE | 240 (=400 x 0.6) |
2020-02-08 | FR | 120 (=400 x 0.3) |
2020-02-08 | NL | 40 (=400 x 0.1) |
--------------|--------------|-----------------------------|---------
2020-04-15 | DE | 180 (=300 x 0.6) |
2020-04-15 | FR | 90 (=300 x 0.3) |
2020-04-15 | NL | 30 (=300 x 0.1) |
我想根据预定义的份额将costs
拆分为每天每个国家/地区。
股份是:DE = 0.6, FR = 0.3, NL = 0.1
SELECT
c.event_date,
c.country,
c.costs
FROM costs c
GROUP BY 1,2,3
ORDER BY 1,2;
你知道我需要什么查询来实现这个吗?
【问题讨论】:
将共享放在另一个表中,将它们连接起来,然后使用这些值进行计算SELECT DISTINCT
有什么问题?
【参考方案1】:
只需使用CASE
表达式:
SELECT c.event_date,
c.country,
(CASE WHEN c.country = 'DE' THEN 0.6 * c.costs
WHEN c.country = 'FR' THEN 0.3 * c.costs
WHEN c.country = 'NL' THEN 0.1 * c.costs
END) as allocated_costs
FROM costs c
GROUP BY c.event_date, c.country, c.costs
ORDER BY 1, 2;
如果您愿意,可以更方便地将值存储在派生表中:
SELECT c.event_date, c.country, (v.alloc * c.costs) as allocated_costs
FROM costs c JOIN
(VALUES ('DE', 0.6), ('FR', 0.3), ('NL', 0.1)
) v(country, alloc)
USING (country)
GROUP BY c.event_date, c.country, c.costs, v.alloc
ORDER BY 1, 2;
Here 是一个 dbfiddle。
【讨论】:
仅用于我的文档:dbfiddle.uk/…【参考方案2】:最好的方法是将这些费率添加到表中并在查询中使用该表。
说明如何在查询中使用硬编码值:
SELECT
c.event_date,
c.country,
c.costs * case country when 'DE' then 0.6
when 'FR' then 0.3
when 'NL' then 0.1
end
FROM costs c
GROUP BY 1,2,3
ORDER BY 1,2;
【讨论】:
以上是关于根据每个国家/地区的预定义份额将固定价值拆分到国家/地区的主要内容,如果未能解决你的问题,请参考以下文章
按国家/地区拆分data.frame,并在每个子集上创建线性回归模型[重复]