mysql复杂的存储过程

 案例存储过程用来做活动的统计数据

CREATE  PROCEDURE `queryActivityExamScoreGroupCount`(in activityCode VARCHAR(50),in groupScore int)
BEGIN
  #Routine body goes here...
    DECLARE totalExamScore DOUBLE;#试卷总分
    DECLARE examinationPaperId int;#试卷id
    DECLARE numGroup int;#分几组分数段
    DECLARE i int DEFAULT(0);#循环值
    DECLARE scoreCount VARCHAR(100);#每组里数量:临时变量
    DECLARE yushu int;
    #先根据活动code查询试卷id
    select examination_paper_id into examinationPaperId from answer_activity where activity_code=activityCode;
    #再根据试卷id查询试卷总分
    select question_total_score into totalExamScore from examination_paper where id=examinationPaperId;
    set yushu=totalExamScore%groupScore;
    #根据试卷总分计算试卷分几段
    set numGroup=(totalExamScore-yushu)/groupScore;
    #定义要返回的数据
    SET @scoreGroupCountStr = '';
    IF (yushu>0 and totalExamScore>groupScore and groupScore>0) or (numGroup=0 and groupScore>0) THEN
     set numGroup=numGroup+1;
  END IF;
    #循环处理每一个分数段人数,并组装返回
    WHILE i<numGroup 
    DO
      IF i=0 THEN
         IF numGroup=1 THEN
         select count(1) into scoreCount from activity_participate where user_score>=i*groupScore and user_score<=(i+1)*groupScore and activity_code=activityCode;
           set @scoreGroupCountStr=CONCAT('[{',@scoreGroupCountStr,'"score":',(i+1)*groupScore,',','"groupRange":"≥',i*groupScore,'≤',totalExamScore,'","scoreCount":',scoreCount, '}]');
         ELSE
       select count(1) into scoreCount from activity_participate where user_score>=i*groupScore and user_score<(i+1)*groupScore and activity_code=activityCode;
           set @scoreGroupCountStr=CONCAT('[{',@scoreGroupCountStr,'"score":',(i+1)*groupScore,',','"groupRange":"≥',i*groupScore,'<',(i+1)*groupScore,'","scoreCount":',scoreCount, '},');
         END IF;
      ELSEIF i<(numGroup-1) THEN
       select count(1) into scoreCount from activity_participate where user_score>=i*groupScore and user_score<(i+1)*groupScore and activity_code=activityCode;
       set @scoreGroupCountStr=CONCAT(@scoreGroupCountStr,'{"score":',(i+1)*groupScore,',','"groupRange":"≥',i*groupScore,'<',(i+1)*groupScore,'","scoreCount":',scoreCount, '},');
      ELSE
       select count(1) into scoreCount from activity_participate where user_score>=i*groupScore and user_score<=(i+1)*groupScore and activity_code=activityCode;
     set @scoreGroupCountStr=CONCAT(@scoreGroupCountStr,'{"score":',(i+1)*groupScore,',','"groupRange":"≥',i*groupScore,'≤',totalExamScore,'","scoreCount":',scoreCount, '}]');
    END IF;
      set i=i+1;
    END WHILE;
    
    select @scoreGroupCountStr;
END
CREATE  PROCEDURE `queryActivityStatisticData`(
IN activityCode VARCHAR(50))
BEGIN
  /**满分人数*/ 
  DECLARE fullMarks int(11);
    /**参与总次数*/ 
    DECLARE sumNumberPartake int(11);
    /**参与总人数*/ 
    DECLARE sumUserPartake int(11);
    /**正确率*/ 
    DECLARE accuracy double(5,2);
    /**最高分*/ 
    DECLARE maxTotalScore double(5,2);
    /**最低分*/ 
    DECLARE minTotalScore double(5,2);
    /**平均分*/ 
    DECLARE avgTotalScore double(5,2);
    /**总分*/ 
    DECLARE totalScore double(5,2);
    
    /**查询满分人数*/ 
    select count(uid)  into fullMarks from activity_participate where user_score=examination_paper_question_total_score and activity_code=activityCode;
    /**查询参与总次数,参与总人数,最高分,最低分,平均分,总分*/ 
    select count(uid) ,count(DISTINCT uid),max(user_score),min(user_score),AVG(user_score),max(examination_paper_question_total_score)  into sumNumberPartake,sumUserPartake,maxTotalScore,minTotalScore,avgTotalScore,totalScore from activity_participate where activity_code=activityCode;
    /**计算正确率*/ 
    set accuracy=fullMarks/sumNumberPartake;
    /**要返回的值*/
    select accuracy,sumNumberPartake,sumUserPartake,maxTotalScore,minTotalScore,avgTotalScore,totalScore;
END

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值