计算每个国家/地区每天的销售份额
Posted
技术标签:
【中文标题】计算每个国家/地区每天的销售份额【英文标题】:Calculate the sales share per country per day 【发布时间】:2021-03-15 13:17:40 【问题描述】:DB-Fiddle
CREATE TABLE sales (
id SERIAL PRIMARY KEY,
event_date DATE,
country VARCHAR,
sales DECIMAL
);
INSERT INTO sales
(event_date, country, sales)
VALUES
('2020-02-08', 'DE', '500'),
('2020-02-08', 'FR', '900'),
('2020-02-08', 'NL', '700'),
('2020-03-20', 'US', '600'),
('2020-03-20', 'DE', '500'),
('2020-04-15', 'NL', '300'),
('2020-04-15', 'FR', '800'),
('2020-04-15', 'NL', '100');
预期结果:
event_date | country | sales_share_per_country_per_day |
------------|-----------|---------------------------------------|-------------
2020-02-08 | DE | 0.24 (=500/2100) |
2020-02-08 | FR | 0.43 (=900/2100) |
2020-02-08 | NL | 0.33 (=700/2100) |
------------|-----------|---------------------------------------|-------------
2020-03-20 | US | 0.55 (=600/1100) |
2020-03-20 | DE | 0.45 (=500/1100) |
------------|-----------|---------------------------------------|-------------
2020-04-15 | NL | 0.25 (=300/1200) |
2020-04-15 | FR | 0.67 (=800/1200) |
2020-04-15 | NL | 0.08 (=100/1100) |
我想计算每个国家/地区每天的销售份额。 因此,我尝试使用此查询:
SELECT
s.event_date,
s.country,
s.sales,
SUM(s.sales) OVER (PARTITION BY s.country) AS sales_share_per_day
FROM sales s
GROUP BY 1,2,3
ORDER BY 1;
但是,我无法达到预期的结果。 你知道我必须如何修改查询吗?
注意:最后我需要这个查询来进行红移。 但是,据我所知,对于窗口函数,redshift 使用 postgresSQL 语法。 因此,我在问题中标记了 redshift 和 postgresSQL。 如果这个假设是错误的,请随时纠正我。
【问题讨论】:
。 .这与您之前提出的问题非常相似。您在这里需要什么与众不同的地方? 【参考方案1】:sales_share_per_day 四舍五入到小数点后两位数
CREATE TABLE sales ( id SERIAL PRIMARY KEY, event_date DATE, country VARCHAR, sales DECIMAL ); INSERT INTO sales (event_date, country, sales) VALUES ('2020-02-08', 'DE', '500'), ('2020-02-08', 'FR', '900'), ('2020-02-08', 'NL', '700'), ('2020-03-20', 'US', '600'), ('2020-03-20', 'DE', '500'), ('2020-04-15', 'NL', '300'), ('2020-04-15', 'FR', '800'), ('2020-04-15', 'NL', '100');
SELECT s.event_date, s.country, s.sales, round(s.sales/sum(s.sales) OVER (PARTITION BY event_date ),2) AS sales_share_per_day FROM sales s ORDER BY 1;
event_date country sales sales_share_per_day 2020-02-08 DE 500 0.24 2020-02-08 FR 900 0.43 2020-02-08 NL 700 0.33 2020-03-20 US 600 0.55 2020-03-20 DE 500 0.45 2020-04-15 NL 300 0.25 2020-04-15 FR 800 0.67 2020-04-15 NL 100 0.08
db小提琴here
不四舍五入:
CREATE TABLE sales ( id SERIAL PRIMARY KEY, event_date DATE, country VARCHAR, sales DECIMAL ); INSERT INTO sales (event_date, country, sales) VALUES ('2020-02-08', 'DE', '500'), ('2020-02-08', 'FR', '900'), ('2020-02-08', 'NL', '700'), ('2020-03-20', 'US', '600'), ('2020-03-20', 'DE', '500'), ('2020-04-15', 'NL', '300'), ('2020-04-15', 'FR', '800'), ('2020-04-15', 'NL', '100');
SELECT s.event_date, s.country, s.sales, s.sales/sum(s.sales) OVER (PARTITION BY event_date ) AS sales_share_per_day FROM sales s ORDER BY 1;
event_date country sales sales_share_per_day 2020-02-08 DE 500 0.23809523809523809524 2020-02-08 FR 900 0.42857142857142857143 2020-02-08 NL 700 0.33333333333333333333 2020-03-20 US 600 0.54545454545454545455 2020-03-20 DE 500 0.45454545454545454545 2020-04-15 NL 300 0.25000000000000000000 2020-04-15 FR 800 0.66666666666666666667 2020-04-15 NL 100 0.08333333333333333333
db小提琴here
【讨论】:
仅用于我自己的文档:dbfiddle.uk/… 如果你愿意,你可以将它四舍五入到 0.24 或 0.43 等。祝你好运。【参考方案2】:你追求的是这个吗?
SELECT
s.event_date,
s.country,
s.sales,
(
s.sales
/ SUM(s.sales) OVER(PARTITION BY event_date)
)::NUMERIC(9,2) AS sales_pct_per_day,
SUM(s.sales) OVER(PARTITION BY event_date) AS sales_share_per_day
FROM sales s
GROUP BY 1,2,3
ORDER BY 1;
event_date country sales sales_pct_per_day sales_share_per_day
2020-02-08 DE 500 0.24 2100
2020-02-08 FR 900 0.43 2100
2020-02-08 NL 700 0.33 2100
2020-03-20 US 600 0.55 1100
2020-03-20 DE 500 0.45 1100
2020-04-15 FR 800 0.67 1200
2020-04-15 NL 300 0.25 1200
2020-04-15 NL 100 0.08 1200
【讨论】:
以上是关于计算每个国家/地区每天的销售份额的主要内容,如果未能解决你的问题,请参考以下文章
检查每个广告系列在一个国家/地区的销售状态是不是已更改,并将其分配给结果中每个广告系列的所有国家/地区
用SQL查询语句 1,计算每个书店书籍的平均单价 2,计算各个地区书籍销售总量 下面分别是销售表,书店表