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

MariaDB 10中计算年度总额及同比占比的SQL异常问题

问题分析与解决

问题根源

你当前的SQL直接将原表与自身关联,导致笛卡尔积:当前年份的每一条记录都会匹配上一年的所有记录。比如2022年有3条记录,2021年有3条,关联后会生成3×3=9条记录,分组求和时year_total和prev_year都会被重复计算,所以出现了171(57×3)、68(34×2)这类错误结果。

正确解法

先按年份聚合得到每年的总金额,再基于这个聚合结果做自关联,避免重复计算:

方法1:使用CTE(MariaDB 10支持)

WITH yearly_totals AS (
    SELECT YEAR(date) AS year, SUM(amount) AS year_total
    FROM payments
    GROUP BY YEAR(date)
)
SELECT
    curr.year,
    curr.year_total,
    prev.year_total AS prev_year,
    ROUND(prev.year_total / curr.year_total * 100) AS percentage
FROM yearly_totals curr
LEFT JOIN yearly_totals prev
    ON prev.year = curr.year - 1
ORDER BY curr.year DESC;

方法2:不使用CTE(兼容更早版本)

SELECT
    curr.year,
    curr.year_total,
    prev.year_total AS prev_year,
    ROUND(prev.year_total / curr.year_total * 100) AS percentage
FROM (
    SELECT YEAR(date) AS year, SUM(amount) AS year_total
    FROM payments
    GROUP BY YEAR(date)
) curr
LEFT JOIN (
    SELECT YEAR(date) AS year, SUM(amount) AS year_total
    FROM payments
    GROUP BY YEAR(date)
) prev
    ON prev.year = curr.year - 1
ORDER BY curr.year DESC;

正确执行结果

+------+------------+-----------+------------+
| year | year_total | prev_year | percentage |
+------+------------+-----------+------------+
| 2022 |         57 |        34 |         60 |
| 2021 |         34 |        25 |         74 |
| 2020 |         25 |      NULL |       NULL |
+------+------------+-----------+------------+

内容的提问来源于stack exchange,提问作者Jibeji

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 19:36:31