mysql 儲存過程動態sql
阿新 • • 發佈:2018-11-12
DROP PROCEDURE IF EXISTS PRO_STA_SYSTEM_ORDER_STATE;
DELIMITER //
CREATE DEFINER=`root`@`%` PROCEDURE `PRO_STA_SYSTEM_ORDER_STATE`(OUT O_RESULT_CODE CHAR(4))
COMMENT '系統訂單實時統計'
BEGIN
DECLARE DONE INT DEFAULT TRUE;-- 定義一個標識為true
DECLARE YEAR_MONTH_STR VARCHAR(10);-- 當前年月
DECLARE CONTINUE HANDLER FOR NOT FOUND,SQLEXCEPTION SET DONE = FALSE;-- 異常的情況標識為false
IF month(curdate()) <= 10 THEN
SET YEAR_MONTH_STR = CONCAT(year(curdate()),0,month(curdate()));-- 例如:201703
ELSE
SET YEAR_MONTH_STR = CONCAT(year(curdate()),month(curdate()));-- 例如:201710
END IF;
#到t_company_flows_order_*_*表查尋包括:今日總訂單量,成功訂單量,流量訂單量,流量成功訂單量,話費訂單量,話費成功訂單量,系統卡單數量(流量貝貝平臺總卡單數量)
SET @asql = CONCAT('SELECT COUNT(1) TOTAL_ORDER_COUNT,
COUNT(CASE WHEN status = ''2'' then 1 else null end ) TOTAL_SUCCESS_ORDER_COUNT,
COUNT(CASE WHEN businessType = 2 then 1 else null end ) FLOW_ORDER_COUNT,
COUNT(CASE WHEN businessType = 2 AND status = ''2'' then 1 else null end ) FLOW_SUCCESS_ORDER_COUNT,
COUNT(CASE WHEN businessType = 1 then 1 else null end ) BILL_ORDER_COUNT,
COUNT(CASE WHEN businessType = 1 AND status = ''2'' then 1 else null end ) BILL_SUCCESS_ORDER_COUNT,
COUNT(CASE WHEN status in(''1'',''3'') then 1 else null end) SYSTEM_STUCK_ORDER_COUNT INTO @TOTAL_ORDER_COUNT,@TOTAL_SUCCESS_ORDER_COUNT,@FLOW_ORDER_COUNT,
@FLOW_SUCCESS_ORDER_COUNT,@BILL_ORDER_COUNT,@BILL_SUCCESS_ORDER_COUNT,@SYSTEM_STUCK_ORDER_COUNT',' FROM (',
'SELECT businessType,status FROM t_company_flows_order_',YEAR_MONTH_STR,'_01 WHERE createDate >= date(now()) and createDate < date(date_add(now(),interval 1 day)) ',
'UNION ALL SELECT businessType,status FROM t_company_flows_order_',YEAR_MONTH_STR,'_02 WHERE createDate >= date(now()) and createDate < date(date_add(now(),interval 1 day)) ',
'UNION ALL SELECT businessType,status FROM t_company_flows_order_',YEAR_MONTH_STR,'_03 WHERE createDate >= date(now()) and createDate < date(date_add(now(),interval 1 day)) ',
'UNION ALL SELECT businessType,status FROM t_company_flows_order_',YEAR_MONTH_STR,'_04 WHERE createDate >= date(now()) and createDate < date(date_add(now(),interval 1 day)) ',
'UNION ALL SELECT businessType,status FROM t_company_flows_order_',YEAR_MONTH_STR,'_05 WHERE createDate >= date(now()) and createDate < date(date_add(now(),interval 1 day)) ',
'UNION ALL SELECT businessType,status FROM t_company_flows_order_',YEAR_MONTH_STR,'_06 WHERE createDate >= date(now()) and createDate < date(date_add(now(),interval 1 day)) ',
'UNION ALL SELECT businessType,status FROM t_company_flows_order_',YEAR_MONTH_STR,'_07 WHERE createDate >= date(now()) and createDate < date(date_add(now(),interval 1 day)) ',
'UNION ALL SELECT businessType,status FROM t_company_flows_order_',YEAR_MONTH_STR,'_08 WHERE createDate >= date(now()) and createDate < date(date_add(now(),interval 1 day)) ',
'UNION ALL SELECT businessType,status FROM t_company_flows_order_',YEAR_MONTH_STR,'_09 WHERE createDate >= date(now()) and createDate < date(date_add(now(),interval 1 day)) ',
'UNION ALL SELECT businessType,status FROM t_company_flows_order_',YEAR_MONTH_STR,'_10 WHERE createDate >= date(now()) and createDate < date(date_add(now(),interval 1 day)) ) tbl');
prepare sqlstmt from @asql;
execute sqlstmt;
#到order_reau_record_*_*表包括:回撥平均成功率,上游渠道卡單數(卡在上游渠道的訂單數量),回撥平均時長(毫秒)
SET @bsql = CONCAT('SELECT IFNULL(ROUND(COUNT(CASE WHEN CALLBACK_STATUS = ''1'' then 1 else null end )/count(1),2),0) CALLBACK_SUCCESS_AVG,
COUNT(CASE WHEN REQUEST_STATUS = ''1'' AND CALLBACK_STATUS = ''0'' then 1 else null end ) REAU_STUCK_ORDER_COUNT,
IFNULL(ROUND(AVG(CALLBACK_TIME),0),0) CALLBACK_TIMES_AVG INTO @CALLBACK_SUCCESS_AVG,@REAU_STUCK_ORDER_COUNT,@CALLBACK_TIMES_AVG',' FROM (',
'SELECT CALLBACK_STATUS,REQUEST_STATUS,CALLBACK_TIME FROM order_reau_record_',YEAR_MONTH_STR,'_01 WHERE DATE_CREATE >= date(now()) and DATE_CREATE < date(date_add(now(),interval 1 day)) ',
'UNION ALL SELECT CALLBACK_STATUS,REQUEST_STATUS,CALLBACK_TIME FROM order_reau_record_',YEAR_MONTH_STR,'_02 WHERE DATE_CREATE >= date(now()) and DATE_CREATE < date(date_add(now(),interval 1 day)) ',
'UNION ALL SELECT CALLBACK_STATUS,REQUEST_STATUS,CALLBACK_TIME FROM order_reau_record_',YEAR_MONTH_STR,'_03 WHERE DATE_CREATE >= date(now()) and DATE_CREATE < date(date_add(now(),interval 1 day)) ',
'UNION ALL SELECT CALLBACK_STATUS,REQUEST_STATUS,CALLBACK_TIME FROM order_reau_record_',YEAR_MONTH_STR,'_04 WHERE DATE_CREATE >= date(now()) and DATE_CREATE < date(date_add(now(),interval 1 day)) ',
'UNION ALL SELECT CALLBACK_STATUS,REQUEST_STATUS,CALLBACK_TIME FROM order_reau_record_',YEAR_MONTH_STR,'_05 WHERE DATE_CREATE >= date(now()) and DATE_CREATE < date(date_add(now(),interval 1 day)) ',
'UNION ALL SELECT CALLBACK_STATUS,REQUEST_STATUS,CALLBACK_TIME FROM order_reau_record_',YEAR_MONTH_STR,'_06 WHERE DATE_CREATE >= date(now()) and DATE_CREATE < date(date_add(now(),interval 1 day)) ',
'UNION ALL SELECT CALLBACK_STATUS,REQUEST_STATUS,CALLBACK_TIME FROM order_reau_record_',YEAR_MONTH_STR,'_07 WHERE DATE_CREATE >= date(now()) and DATE_CREATE < date(date_add(now(),interval 1 day)) ',
'UNION ALL SELECT CALLBACK_STATUS,REQUEST_STATUS,CALLBACK_TIME FROM order_reau_record_',YEAR_MONTH_STR,'_08 WHERE DATE_CREATE >= date(now()) and DATE_CREATE < date(date_add(now(),interval 1 day)) ',
'UNION ALL SELECT CALLBACK_STATUS,REQUEST_STATUS,CALLBACK_TIME FROM order_reau_record_',YEAR_MONTH_STR,'_09 WHERE DATE_CREATE >= date(now()) and DATE_CREATE < date(date_add(now(),interval 1 day)) ',
'UNION ALL SELECT CALLBACK_STATUS,REQUEST_STATUS,CALLBACK_TIME FROM order_reau_record_',YEAR_MONTH_STR,'_10 WHERE DATE_CREATE >= date(now()) and DATE_CREATE < date(date_add(now(),interval 1 day)) ) tb1');
prepare sqlstmt from @bsql;
execute sqlstmt;
#儲存到sta_system_order_state系統訂單實時統計表中
INSERT INTO sta_system_order_state(DATE_CREATED,TOTAL_ORDER_COUNT,TOTAL_SUCCESS_ORDER_COUNT,FLOW_ORDER_COUNT,FLOW_SUCCESS_ORDER_COUNT,BILL_ORDER_COUNT,BILL_SUCCESS_ORDER_COUNT,CALLBACK_SUCCESS_AVG,
SYSTEM_STUCK_ORDER_COUNT,REAU_STUCK_ORDER_COUNT,CALLBACK_TIMES_AVG) VALUES
(NOW(),@TOTAL_ORDER_COUNT,@TOTAL_SUCCESS_ORDER_COUNT,@FLOW_ORDER_COUNT,@FLOW_SUCCESS_ORDER_COUNT,@BILL_ORDER_COUNT,@BILL_SUCCESS_ORDER_COUNT,@CALLBACK_SUCCESS_AVG,
@SYSTEM_STUCK_ORDER_COUNT,@REAU_STUCK_ORDER_COUNT,@CALLBACK_TIMES_AVG);
IF DONE THEN
SET O_RESULT_CODE = '0000';-- 成功 '0000'
ELSE
SET O_RESULT_CODE = '9999';-- 失敗 '9999'
END IF;
END//
總結:通過into關鍵字可以將欄位放入臨時變數中,然後就可以操作了
DELIMITER //
CREATE DEFINER=`root`@`%` PROCEDURE `PRO_STA_SYSTEM_ORDER_STATE`(OUT O_RESULT_CODE CHAR(4))
COMMENT '系統訂單實時統計'
BEGIN
DECLARE DONE INT DEFAULT TRUE;-- 定義一個標識為true
DECLARE YEAR_MONTH_STR VARCHAR(10);-- 當前年月
DECLARE CONTINUE HANDLER FOR NOT FOUND,SQLEXCEPTION SET DONE = FALSE;-- 異常的情況標識為false
IF month(curdate()) <= 10 THEN
SET YEAR_MONTH_STR = CONCAT(year(curdate()),0,month(curdate()));-- 例如:201703
ELSE
SET YEAR_MONTH_STR = CONCAT(year(curdate()),month(curdate()));-- 例如:201710
END IF;
#到t_company_flows_order_*_*表查尋包括:今日總訂單量,成功訂單量,流量訂單量,流量成功訂單量,話費訂單量,話費成功訂單量,系統卡單數量(流量貝貝平臺總卡單數量)
SET @asql = CONCAT('SELECT COUNT(1) TOTAL_ORDER_COUNT,
COUNT(CASE WHEN status = ''2'' then 1 else null end ) TOTAL_SUCCESS_ORDER_COUNT,
COUNT(CASE WHEN businessType = 2 then 1 else null end ) FLOW_ORDER_COUNT,
COUNT(CASE WHEN businessType = 2 AND status = ''2'' then 1 else null end ) FLOW_SUCCESS_ORDER_COUNT,
COUNT(CASE WHEN businessType = 1 then 1 else null end ) BILL_ORDER_COUNT,
COUNT(CASE WHEN businessType = 1 AND status = ''2'' then 1 else null end ) BILL_SUCCESS_ORDER_COUNT,
COUNT(CASE WHEN status in(''1'',''3'') then 1 else null end) SYSTEM_STUCK_ORDER_COUNT INTO @TOTAL_ORDER_COUNT,@TOTAL_SUCCESS_ORDER_COUNT,@FLOW_ORDER_COUNT,
@FLOW_SUCCESS_ORDER_COUNT,@BILL_ORDER_COUNT,@BILL_SUCCESS_ORDER_COUNT,@SYSTEM_STUCK_ORDER_COUNT',' FROM (',
'SELECT businessType,status FROM t_company_flows_order_',YEAR_MONTH_STR,'_01 WHERE createDate >= date(now()) and createDate < date(date_add(now(),interval 1 day)) ',
'UNION ALL SELECT businessType,status FROM t_company_flows_order_',YEAR_MONTH_STR,'_02 WHERE createDate >= date(now()) and createDate < date(date_add(now(),interval 1 day)) ',
'UNION ALL SELECT businessType,status FROM t_company_flows_order_',YEAR_MONTH_STR,'_03 WHERE createDate >= date(now()) and createDate < date(date_add(now(),interval 1 day)) ',
'UNION ALL SELECT businessType,status FROM t_company_flows_order_',YEAR_MONTH_STR,'_04 WHERE createDate >= date(now()) and createDate < date(date_add(now(),interval 1 day)) ',
'UNION ALL SELECT businessType,status FROM t_company_flows_order_',YEAR_MONTH_STR,'_05 WHERE createDate >= date(now()) and createDate < date(date_add(now(),interval 1 day)) ',
'UNION ALL SELECT businessType,status FROM t_company_flows_order_',YEAR_MONTH_STR,'_06 WHERE createDate >= date(now()) and createDate < date(date_add(now(),interval 1 day)) ',
'UNION ALL SELECT businessType,status FROM t_company_flows_order_',YEAR_MONTH_STR,'_07 WHERE createDate >= date(now()) and createDate < date(date_add(now(),interval 1 day)) ',
'UNION ALL SELECT businessType,status FROM t_company_flows_order_',YEAR_MONTH_STR,'_08 WHERE createDate >= date(now()) and createDate < date(date_add(now(),interval 1 day)) ',
'UNION ALL SELECT businessType,status FROM t_company_flows_order_',YEAR_MONTH_STR,'_09 WHERE createDate >= date(now()) and createDate < date(date_add(now(),interval 1 day)) ',
'UNION ALL SELECT businessType,status FROM t_company_flows_order_',YEAR_MONTH_STR,'_10 WHERE createDate >= date(now()) and createDate < date(date_add(now(),interval 1 day)) ) tbl');
prepare sqlstmt from @asql;
execute sqlstmt;
#到order_reau_record_*_*表包括:回撥平均成功率,上游渠道卡單數(卡在上游渠道的訂單數量),回撥平均時長(毫秒)
SET @bsql = CONCAT('SELECT IFNULL(ROUND(COUNT(CASE WHEN CALLBACK_STATUS = ''1'' then 1 else null end )/count(1),2),0) CALLBACK_SUCCESS_AVG,
COUNT(CASE WHEN REQUEST_STATUS = ''1'' AND CALLBACK_STATUS = ''0'' then 1 else null end ) REAU_STUCK_ORDER_COUNT,
IFNULL(ROUND(AVG(CALLBACK_TIME),0),0) CALLBACK_TIMES_AVG INTO @CALLBACK_SUCCESS_AVG,@REAU_STUCK_ORDER_COUNT,@CALLBACK_TIMES_AVG',' FROM (',
'SELECT CALLBACK_STATUS,REQUEST_STATUS,CALLBACK_TIME FROM order_reau_record_',YEAR_MONTH_STR,'_01 WHERE DATE_CREATE >= date(now()) and DATE_CREATE < date(date_add(now(),interval 1 day)) ',
'UNION ALL SELECT CALLBACK_STATUS,REQUEST_STATUS,CALLBACK_TIME FROM order_reau_record_',YEAR_MONTH_STR,'_02 WHERE DATE_CREATE >= date(now()) and DATE_CREATE < date(date_add(now(),interval 1 day)) ',
'UNION ALL SELECT CALLBACK_STATUS,REQUEST_STATUS,CALLBACK_TIME FROM order_reau_record_',YEAR_MONTH_STR,'_03 WHERE DATE_CREATE >= date(now()) and DATE_CREATE < date(date_add(now(),interval 1 day)) ',
'UNION ALL SELECT CALLBACK_STATUS,REQUEST_STATUS,CALLBACK_TIME FROM order_reau_record_',YEAR_MONTH_STR,'_04 WHERE DATE_CREATE >= date(now()) and DATE_CREATE < date(date_add(now(),interval 1 day)) ',
'UNION ALL SELECT CALLBACK_STATUS,REQUEST_STATUS,CALLBACK_TIME FROM order_reau_record_',YEAR_MONTH_STR,'_05 WHERE DATE_CREATE >= date(now()) and DATE_CREATE < date(date_add(now(),interval 1 day)) ',
'UNION ALL SELECT CALLBACK_STATUS,REQUEST_STATUS,CALLBACK_TIME FROM order_reau_record_',YEAR_MONTH_STR,'_06 WHERE DATE_CREATE >= date(now()) and DATE_CREATE < date(date_add(now(),interval 1 day)) ',
'UNION ALL SELECT CALLBACK_STATUS,REQUEST_STATUS,CALLBACK_TIME FROM order_reau_record_',YEAR_MONTH_STR,'_07 WHERE DATE_CREATE >= date(now()) and DATE_CREATE < date(date_add(now(),interval 1 day)) ',
'UNION ALL SELECT CALLBACK_STATUS,REQUEST_STATUS,CALLBACK_TIME FROM order_reau_record_',YEAR_MONTH_STR,'_08 WHERE DATE_CREATE >= date(now()) and DATE_CREATE < date(date_add(now(),interval 1 day)) ',
'UNION ALL SELECT CALLBACK_STATUS,REQUEST_STATUS,CALLBACK_TIME FROM order_reau_record_',YEAR_MONTH_STR,'_09 WHERE DATE_CREATE >= date(now()) and DATE_CREATE < date(date_add(now(),interval 1 day)) ',
'UNION ALL SELECT CALLBACK_STATUS,REQUEST_STATUS,CALLBACK_TIME FROM order_reau_record_',YEAR_MONTH_STR,'_10 WHERE DATE_CREATE >= date(now()) and DATE_CREATE < date(date_add(now(),interval 1 day)) ) tb1');
prepare sqlstmt from @bsql;
execute sqlstmt;
#儲存到sta_system_order_state系統訂單實時統計表中
INSERT INTO sta_system_order_state(DATE_CREATED,TOTAL_ORDER_COUNT,TOTAL_SUCCESS_ORDER_COUNT,FLOW_ORDER_COUNT,FLOW_SUCCESS_ORDER_COUNT,BILL_ORDER_COUNT,BILL_SUCCESS_ORDER_COUNT,CALLBACK_SUCCESS_AVG,
SYSTEM_STUCK_ORDER_COUNT,REAU_STUCK_ORDER_COUNT,CALLBACK_TIMES_AVG) VALUES
(NOW(),@TOTAL_ORDER_COUNT,@TOTAL_SUCCESS_ORDER_COUNT,@FLOW_ORDER_COUNT,@FLOW_SUCCESS_ORDER_COUNT,@BILL_ORDER_COUNT,@BILL_SUCCESS_ORDER_COUNT,@CALLBACK_SUCCESS_AVG,
@SYSTEM_STUCK_ORDER_COUNT,@REAU_STUCK_ORDER_COUNT,@CALLBACK_TIMES_AVG);
IF DONE THEN
SET O_RESULT_CODE = '0000';-- 成功 '0000'
ELSE
SET O_RESULT_CODE = '9999';-- 失敗 '9999'
END IF;
END//
DELIMITER ;