存储过程内容如下:在有就是我觉得自己写的存储过程比较啰嗦,请高手指点一二,但是功能实现了,效率一般。
mysql太难用了
DELIMITER $$USE `astrolink`$$DROP PROCEDURE IF EXISTS `ONLINE_STATISTICS_REAL_DAY_INCOME`$$CREATE DEFINER=`root`@`%` PROCEDURE `ONLINE_STATISTICS_REAL_DAY_INCOME`(
IN startDate VARCHAR(19), #日期2014-04-22
IN endDate VARCHAR(19), #日期2014-04-24
IN prov_id VARCHAR(2000),
IN city_id VARCHAR(2000),
IN cp_id VARCHAR(2000),
IN sendCode VARCHAR(2000),
IN statisticsType INT 
)
BEGIN
DECLARE prov_id_where VARCHAR(2050);
DECLARE city_id_where VARCHAR(2050);
DECLARE cp_id_where VARCHAR(2050);
DECLARE sendCode_id_where VARCHAR(2050);
DECLARE result VARCHAR(200);


IF cp_id!='' THEN
SET cp_id_where=CONCAT(' HAVING cp_id in(',cp_id,') ');
ELSE 
SET cp_id_where=' ';
END IF;


IF prov_id!='' THEN
SET prov_id_where=CONCAT(' HAVING prov_id in(',prov_id,') ');
ELSE
SET prov_id_where=' ';
END IF;

IF city_id!='' THEN
IF prov_id_where=' ' THEN
SET city_id_where=CONCAT(' HAVING city_id in(',city_id,') ');
ELSE
SET city_id_where=CONCAT(' AND city_id in(',city_id,') ');
END IF;
ELSE
SET city_id_where=' ';
END IF;

IF sendCode!='' THEN
IF prov_id_where=' ' AND city_id_where=' ' THEN
SET sendCode_id_where=CONCAT(' HAVING sendCode in(',sendCode,') ');
ELSE
SET sendCode_id_where=CONCAT(' AND sendCode in(',sendCode,') ');
END IF;
ELSE 
SET sendCode_id_where='';
END IF;


IF statisticsType=1 THEN
SET result='cpname';
ELSEIF statisticsType=2 THEN
SET result='prov';
ELSEIF statisticsType=3 THEN
SET result='company_name';
ELSE 
SET result='cpname';
END IF;

SET @v_sql=CONCAT('SELECT * FROM (
SELECT 
IFNULL(_parentId, \'Total\')  AS  _parentId,
CAST(IFNULL(region, \'Total\') AS CHAR(100)) AS  region,
ROUND(SUM(实际总收入),1) AS 实际总收入 ,
ROUND(SUM(实际成功收入),1) AS 实际成功收入,
ROUND(SUM(实际失败收入),1) AS 实际失败收入,
SUM(实际计费人数) AS 实际计费人数,
SUM(实际计费次数) AS 实际计费次数,
SUM(实际成功次数) AS 实际成功次数,
SUM(实际失败次数) AS 实际失败次数,
SUM(用户充值失败次数) AS 用户充值失败次数,
SUM(计费系统错误代码成功) AS 计费系统错误代码成功,
SUM(余额不足够) AS 余额不足够,
SUM(充值金额超过当天最大限额) AS 充值金额超过当天最大限额,
SUM(充值金额超过当月最大限额) AS 充值金额超过当月最大限额,
SUM(自动充值其他错误) AS 自动充值其他错误
FROM (
SELECT 
DATE_FORMAT(TIME,\'%Y%m%d\') AS _parentId, 
',result,' AS region,
SUM(price/100) AS 实际总收入,
SUM(CASE WHEN hRet=0 THEN price/100 ELSE 0 END) AS 实际成功收入,
SUM(CASE WHEN hRet!=0 THEN price/100 ELSE 0 END) AS 实际失败收入,
COUNT(DISTINCT userId) AS 实际计费人数,
COUNT(0) AS 实际计费次数,
SUM(CASE WHEN hRet=0 THEN 1 ELSE 0 END) AS 实际成功次数,
SUM(CASE WHEN hRet!=0 THEN 1 ELSE 0 END) AS 实际失败次数,
SUM(CASE WHEN STATUS=1101 AND hRet=1 THEN 1 ELSE 0 END) AS 用户充值失败次数,
SUM(CASE WHEN STATUS=0 THEN 1 ELSE 0 END) AS 计费系统错误代码成功,
SUM(CASE WHEN STATUS=127 THEN 1 ELSE 0 END) AS 余额不足够,
SUM(CASE WHEN STATUS=204 THEN 1 ELSE 0 END) AS 充值金额超过当天最大限额,
SUM(CASE WHEN STATUS=205 THEN 1 ELSE 0 END) AS 充值金额超过当月最大限额,
SUM(CASE WHEN STATUS=399 THEN 1 ELSE 0 END) AS 自动充值其他错误 
FROM ( 
SELECT 
a.mobile,
a.TIME,
a.userId,
CASE WHEN b.prov IS NULL THEN \'未知\' ELSE b.prov END AS prov,
CASE WHEN b.city IS NULL THEN \'未知\' ELSE b.city END AS city,
CASE WHEN b.prov_id IS NULL THEN -1 ELSE b.prov_id END AS prov_id,
CASE WHEN b.city_id IS NULL THEN -1 ELSE b.city_id END AS city_id,
c.cp_id,
CASE WHEN c.cpname IS NULL THEN \'未知\' ELSE c.cpname END AS cpname,
d.chargePoint_id,
CAST(CONCAT(d.company_name,\'(\',d.companyCode,\')\',\' - \',d.appName,\' - \',d.appVersionDesc,\' - \',d.chargePointName,\' - \',d.price,\'点\') AS CHAR(100)) AS company_name,
d.price,
d.sendCode,
a.STATUS,
a.hRet
FROM (
SELECT 
mobile,TIME,consumeCode,STATUS,hRet,userId,
CASE WHEN SUBSTRING(mobile,1,7) IS NULL THEN -1 ELSE SUBSTRING(mobile,1,7) END AS mob7, 
CASE WHEN LENGTH(cpParam)>3 THEN CAST(SUBSTR(cpParam,1,3) AS SIGNED INTEGER)  ELSE -1 END AS cp_id 
FROM cmcc.sendana WHERE DATE_FORMAT(TIME,\'%Y-%m-%d\')>=\'',startDate,'\' AND DATE_FORMAT(TIME,\'%Y-%m-%d\')<=\'',endDate,'\' ', 
') AS a LEFT JOIN Mob_city AS b ON a.mob7=b.mob7 
LEFT JOIN CPInfo AS c ON a.cp_id=c.cp_id 
LEFT JOIN ChargePointInfo_View  AS d ON a.consumeCode=d.sendCode ',
prov_id_where,city_id_where,sendCode_id_where,
' ) AS payInfo
GROUP BY region,_parentId 
) AS info  
GROUP BY _parentId, region WITH ROLLUP
 )AS dataInfo 
 ORDER BY _parentId,实际总收入 DESC ');

#select @v_sql;
PREPARE stmt FROM @v_sql;  #预处理需要执行的动态SQL,其中stmt是一个变量  
EXECUTE stmt;      #执行SQL语句  
DEALLOCATE PREPARE stmt;     #释放掉预处理段  
END$$DELIMITER ;