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

MySQL存储过程查询失效:需输出12个月统计数据求助

修复后的MySQL存储过程(2023年12个月金额统计)

原代码存在的问题

  • 局部变量声明错误:DECLARE定义的局部变量不应加@前缀,@是MySQL会话级用户变量的标识。
  • 赋值语法错误:子查询赋值给变量时必须用括号()包裹。
  • 循环逻辑错误:return语句会直接终止存储过程,导致循环仅执行一次就退出;且每次循环覆盖变量值,无法保留12个月的统计数据。
  • 结果输出错误:仅在循环结束后执行一次select,无法输出12条月度统计记录。

方案1:使用集合查询(推荐,更高效)

不需要循环,直接生成1-12的月份列表,通过左连接统计每个月的金额,确保即使某月份无数据也能返回0值:

DROP PROCEDURE IF EXISTS my_example;
DELIMITER //

CREATE PROCEDURE my_example()
BEGIN
    -- 生成1到12的月份列表
    WITH months AS (
        SELECT 1 AS month UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL
        SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL
        SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9 UNION ALL
        SELECT 10 UNION ALL SELECT 11 UNION ALL SELECT 12
    )
    SELECT 
        m.month AS 月份,
        COALESCE(SUM(s.famount), 0.0) AS 金额
    FROM months m
    LEFT JOIN grossitems s 
        ON s.mmonth = m.month 
        AND s.myear = 2023 
        AND s.idnum = '1117'
    GROUP BY m.month
    ORDER BY m.month;
END //

DELIMITER ;

方案2:使用循环+临时表(兼容低版本MySQL,无WITH语法)

如果你的MySQL版本不支持CTE(WITH语句),可以用循环配合临时表存储每个月的统计结果:

DROP PROCEDURE IF EXISTS my_example;
DELIMITER //

CREATE PROCEDURE my_example()
wholeblock:BEGIN
    DECLARE amount DOUBLE DEFAULT 0.0;
    DECLARE x INT DEFAULT 1;
    
    -- 创建临时表存储结果
    CREATE TEMPORARY TABLE IF NOT EXISTS monthly_stats (
        month INT,
        amount DOUBLE
    );
    -- 清空临时表(避免重复调用时残留数据)
    TRUNCATE TABLE monthly_stats;
    
    WHILE x <= 12 DO
        -- 子查询赋值需用括号包裹,处理无数据时返回0
        SELECT COALESCE(SUM(famount), 0.0) INTO amount 
        FROM grossitems s 
        WHERE s.mmonth = x 
          AND s.myear = 2023 
          AND s.idnum = '1117';
        
        -- 将当月统计插入临时表
        INSERT INTO monthly_stats VALUES(x, amount);
        
        SET x = x + 1;
    END WHILE;
    
    -- 输出所有月份的统计结果
    SELECT month AS 月份, amount AS 金额 FROM monthly_stats ORDER BY month;
    
    -- 销毁临时表(可选,临时表会在会话结束后自动删除)
    DROP TEMPORARY TABLE IF EXISTS monthly_stats;
END //

DELIMITER ;

使用说明

  • 执行存储过程:CALL my_example();
  • 两种方案都会返回12条记录,包含2023年每个月的金额统计,无数据的月份金额显示为0.0。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 15:27:09