如何为2022-2024财年Top5电动汽车制造商计算总销量及复合年增长率(CAGR)
如何为2022-2024财年Top5电动汽车制造商计算总销量及复合年增长率(CAGR)
我太懂你现在的卡点了——已经顺利算出Top5制造商的总销量,但要把CAGR加进去的时候就卡壳了对吧?你的思路方向是对的,但直接在主查询里用聚合后的total_ev_sold和所谓的starting_point会有问题,毕竟SQL的执行顺序是先过滤、再分组聚合,最后才处理SELECT里的计算,而且你还得单独拿到每个制造商2022年的起始销量才行。
先明确下CAGR的核心公式:
CAGR = [(期末销量/期初销量)^(1/年数) - 1]
这里的年数是2024-2022=2年,所以是开平方后减1。
下面给你一个通用的解决方案,用CTE(公共表表达式)来分步处理,大多数主流数据库(PostgreSQL、MySQL、SQL Server等)都能兼容:
WITH maker_sales_summary AS ( SELECT maker, SUM(electric_vehicles_sold) AS total_ev_sold, -- 提取2022年的起始销量 MAX(CASE WHEN fiscal_year = 2022 THEN electric_vehicles_sold ELSE 0 END) AS fy2022_sales, -- 提取2024年的期末销量 MAX(CASE WHEN fiscal_year = 2024 THEN electric_vehicles_sold ELSE 0 END) AS fy2024_sales FROM new_schema.sales_by_makers WHERE fiscal_year BETWEEN 2022 AND 2024 AND vehicle_category = '4-Wheelers' GROUP BY maker ) SELECT maker, total_ev_sold, -- 计算CAGR,同时处理2022年销量为0的异常情况(避免除以0报错) CASE WHEN fy2022_sales = 0 THEN NULL ELSE POWER(fy2024_sales::FLOAT / fy2022_sales, 1.0/2) - 1 END AS cagr FROM maker_sales_summary ORDER BY total_ev_sold DESC LIMIT 5;
这段代码的逻辑拆解:
- 第一步(CTE部分):先对每个制造商做聚合,算出2022-2024的总销量,同时用
CASE WHEN分别抓取2022年的起始销量和2024年的期末销量(用MAX是因为假设每个制造商每年只有一条销量记录,取最大值就等于该年的实际销量)。 - 第二步(主查询):基于CTE的结果计算CAGR,用
POWER函数做幂运算(比直接用^更通用,不同数据库对^的支持有差异),同时加了CASE WHEN处理2022年销量为0的情况——这种场景下CAGR没有意义,返回NULL更合理。
为什么你原来的写法行不通?
你原来的查询里,total_ev_sold是SUM聚合后的结果,SQL不允许在同一个SELECT子句里直接引用聚合结果来做其他计算;而且starting_point也没有被定义,你得先单独提取2022年的销量才能用。
备注:内容来源于stack exchange,提问作者NVG
相关产品推荐
相关产品推荐

