You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.16 07:50:31