按我理解应该是每月初生成一条新的记录插入到月表去吧?delimiter //
create procedure Calcu_MonTotal()
begin
DECLARE v_date varchar(16);
DECLARE v_total int(11);
SELECT DATE_FORMAT( DATE_ADD( NOW( ) , INTERVAL '-1' MONTH ),'%Y-%m') into v_date,sum(daytotal) into v_total
FROM ribao
WHERE ddate> DATE_FORMAT( DATE_ADD( NOW( ) , INTERVAL '-1' MONTH ),'%Y-%m') 
and ddate < DATE_FORMAT(NOW(),'%Y-%m');
insert into yuetotal (ddate,yuetotal) values (v_date,v_total);
end

解决方案 »

  1.   

    抱歉   select into语法写错了delimiter //
    create procedure Calcu_MonTotal()
    begin
    DECLARE v_date varchar(16);
    DECLARE v_total int(11);
    SELECT DATE_FORMAT( DATE_ADD( NOW( ) , INTERVAL '-1' MONTH ),'%Y-%m'),sum(daytotal) into v_date,v_total
    FROM ribao
    WHERE ddate> DATE_FORMAT( DATE_ADD( NOW( ) , INTERVAL '-1' MONTH ),'%Y-%m') 
    and ddate < DATE_FORMAT(NOW(),'%Y-%m');
    insert into yuetotal (ddate,yuetotal) values (v_date,v_total);
    end
      

  2.   

    两张表都落下一个字段,不好意思
    ribao(id, tagname, ddate, daytotal)和yuebao(id, tagname, ddate, yuetotal),
    这样是否存在一个问题,ribao表每个位号(tagname)都有多条记录,如2014-04-01到2014-04-30就30条记录,我想把每个位号4月01日到30日的daytotal字段相加后,存储在yuebao表中,yuebao的ddate字段格式为2014-04,这样的话,sql语句该怎么写啊?
      

  3.   

    那就用游标吧,代码没测试,建议先用测试数据测试一下能不能正常运行delimiter //
    create procedure Calcu_MonTotal()
    begin
    DECLARE v_date varchar(16);
    DECLARE v_total int;
    DECLARE v_tagname varchar(32);
    SELECT DATE_FORMAT( DATE_ADD( NOW( ) , INTERVAL '-1' MONTH ),'%Y-%m') into v_date;
    DECLARE cursor c_Fetch
    For select tagname,sum(daytotal) 
    FROM ribao
    WHERE ddate> DATE_FORMAT( DATE_ADD( NOW( ) , INTERVAL '-1' MONTH ),'%Y-%m') 
    and ddate < DATE_FORMAT(NOW(),'%Y-%m') group by tagname;
    DECLARE CONTINUE HANDLER FOR NOT FOUND set stopFlag=1;
    OPEN c_Fetch;
    REPEAT
    FETCH c_Fetch INTO v_tagname,v_total;
    begin
    insert into yuetotal (tagname,ddate,yuetotal) values (v_tagname,v_date,v_total);
    end;
    UNTIL stopFlag = 1
    END REPEAT;
    CLOSE c_Fetch;
    end
      

  4.   

    代码又写错。。好久不写了,呵呵delimiter //
    create procedure Calcu_MonTotal()
    begin
    DECLARE v_date varchar(16);
    DECLARE v_total int;
    DECLARE v_tagname varchar(32);
    SELECT DATE_FORMAT( DATE_ADD( NOW( ) , INTERVAL '-1' MONTH ),'%Y-%m') into v_date;
    DECLARE c_Fetch CURSOR
    FOR SELECT tagname,sum(daytotal) 
    FROM ribao
    WHERE ddate> DATE_FORMAT( DATE_ADD( NOW( ) , INTERVAL '-1' MONTH ),'%Y-%m') 
    and ddate < DATE_FORMAT(NOW(),'%Y-%m') group by tagname;
    DECLARE CONTINUE HANDLER FOR NOT FOUND set stopFlag=1;
    OPEN c_Fetch;
    REPEAT
    FETCH c_Fetch INTO v_tagname,v_total;
        begin
            insert into yuetotal (tagname,ddate,yuetotal) values (v_tagname,v_date,v_total);
        end;
    UNTIL stopFlag = 1
    END REPEAT;
    CLOSE c_Fetch;
    end
      

  5.   

    我调试您写的代码,报错,我找了好久也没发现错误,您再给看看
    调试报错信息如下:
    error 1064(42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'declare c_Fetch cursor for select tagname,sum(daytotal) from ribao whe' at line 8
      

  6.   


    select语句能成功执行吗?
    SELECT tagname,sum(daytotal) 
    FROM ribao
    WHERE ddate> DATE_FORMAT( DATE_ADD( NOW( ) , INTERVAL '-1' MONTH ),'%Y-%m') 
    and ddate < DATE_FORMAT(NOW(),'%Y-%m') group by tagname;
      

  7.   

    select 语句单独能执行,另外我感觉group by语句也没达到预期目的,3楼我说的一个位号多个日期的,可能没说明白,举例吧:
      

  8.   

    最终得到四条记录,存到yuebao表中
    ddate          tagname     yuetaotal
    2014-03     ti1011          ?
    2014-04     ti1011          ?
    2014-03     ti1021          ?
    2014-04     ti1021          ?
      

  9.   

    额、、、发现漏了个条件,加上:SELECT tagname,sum(daytotal),DATE_FORMAT( ddate,'%Y-%m')  as dt
    FROM ribao
    WHERE ddate> DATE_FORMAT( DATE_ADD( NOW( ) , INTERVAL '-1' MONTH ),'%Y-%m') 
    and ddate < DATE_FORMAT(NOW(),'%Y-%m') group by tagname,dt;看看这个能不能正确得到结果
      

  10.   

    是我多虑了,group by tagname就能实现了,dt不用加,前天报错,SELECT DATE_FORMAT( DATE_ADD( NOW( ) , INTERVAL '-1' MONTH ),'%Y-%m') into v_date; 引起的,今天把这句代码整合到游标的select语句就不报错了,不知道是为什么,没分析出来。
    现在存储过能正确运行,但最后一条记录在yubao表多插入一次,游标循环还是有点小问题
      

  11.   

    非常感谢您的耐心指导,游标循环最后一条记录重复问题,我从网上找到解决办法了:
    .......
    declare stopFlag int default 0;
    .......
    open c_Fetch; 
    repeat 
    fetch c_Fetch into v_date,v_tagname,v_total; 
    if stopFlag = 0 then        
          insert into yuebao(ddate,tagname,device,yuetotal) 
          values (v_date,v_tagname,v_total);     
    end if;
    until stopFlag = 1 end repeat; 
    close c_Fetch;