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', 'FR', 'channel_01', '400'),
('2020-02-08', 'FR', 'channel_02', '400'),
('2020-02-08', 'NL', 'channel_01', '400'),
('2020-02-08', 'NL', 'channel_02', '400'),
('2020-04-15', 'DE', 'channel_01', '300'),
('2020-04-15', 'DE', 'channel_02', '300'),
('2020-04-15', 'FR', 'channel_01', '300'),
('2020-04-15', 'FR', 'channel_02', '300'),
('2020-04-15', 'NL', 'channel_01', '300'),
('2020-04-15', 'NL', 'channel_02', '300');
预期结果:
event_date | country | channel | costs |
--------------|--------------|-------------------|-------------------------------|---------
2020-02-08 | DE | channel_01 | 120 (=400 x 0.6 / 2) |
2020-02-08 | DE | channel_02 | 120 (=400 x 0.6 / 2) |
2020-02-08 | FR | channel_01 | 60 (=400 x 0.3 / 2) |
2020-02-08 | FR | channel_02 | 60 (=400 x 0.3 / 2) |
2020-02-08 | NL | channel_01 | 20 (=400 x 0.1 / 2) |
2020-02-08 | NL | channel_02 | 20 (=400 x 0.1 / 2) |
--------------|--------------|-------------------|-------------------------------|---------
2020-04-15 | DE | channel_01 | 90 (=300 x 0.6 / 2) |
2020-04-15 | DE | channel_02 | 90 (=300 x 0.6 / 2) |
2020-04-15 | FR | channel_01 | 45 (=300 x 0.3 / 2) |
2020-04-15 | FR | channel_02 | 45 (=300 x 0.3 / 2) |
2020-04-15 | NL | channel_01 | 15 (=300 x 0.1 / 2) |
2020-04-15 | NL | channel_02 | 15 (=300 x 0.1 / 2) |
通过来自 this question 的以下查询,我能够根据预定义的份额 (DE=0.6, FR=0.3, NL=0.1)
将成本分摊到每个国家/地区每天。
SELECT
c.event_date,
c.country,
c.channel,
(CASE WHEN c.country IN('DE') THEN c.costs * 0.6
WHEN c.country IN('FR') THEN c.costs * 0.3
WHEN c.country IN('NL') THEN c.costs * 0.1 END) AS costs
FROM costs c
GROUP BY 1,2,3,4
ORDER BY 1,2,3;
但是,正如您在预期结果中看到的那样,我还希望将每个国家/地区的费用 平均分配给每个渠道。
我需要如何修改查询来实现这一点?
答案 0 :(得分:0)
您只需使用窗口函数:
SELECT
c.event_date,
c.country,
c.channel,
c.costs,
(CASE WHEN c.country IN ('DE') THEN c.costs * 0.6
WHEN c.country IN ('FR') THEN c.costs * 0.3
WHEN c.country IN ('NL') THEN c.costs * 0.1
END) * (1.0 / COUNT(*) OVER (PARTITION BY c.event_date, c.country)) AS costs_allocated
FROM costs c
GROUP BY 1,2,3,4
ORDER BY 1,2,3;