根据每个国家/地区的预定义份额将固定价值拆分到国家/地区

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;

【讨论】:

以上是关于根据每个国家/地区的预定义份额将固定价值拆分到国家/地区的主要内容,如果未能解决你的问题,请参考以下文章

计算每个国家/地区每天的销售份额

将 IP 地址与国家/地区相关联[关闭]

按国家/地区拆分data.frame,并在每个子集上创建线性回归模型[重复]

根据支付网关和国家/地区对 WooCommerce 自定义费用征税

使用 groupby [Python] 时如何将值相乘

根据列中的国家/地区名称插入国家/地区官方语言