CALCCHECKING.sql 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. DROP PROCEDURE IF EXISTS `CALCCHECKING`;
  2. delimiter ;;
  3. CREATE PROCEDURE `CALCCHECKING`(IN `PCPID` INT)
  4. LABEL : BEGIN-- 遍历数据结束标志
  5. DECLARE
  6. MCOLUMNNAME,
  7. MVALUES,
  8. MVALUES0,
  9. MVALUES1,
  10. MVALUES2 VARCHAR ( 100 );-- 定义预处理SQL语句
  11. DECLARE
  12. SQL_FOR_SELECT VARCHAR ( 2000 );
  13. DECLARE
  14. MCOUNT INT DEFAULT 0;
  15. DECLARE
  16. DONE INT DEFAULT FALSE;
  17. DECLARE
  18. MISMONTH,
  19. MISSEND TINYINT;-- 游标
  20. DECLARE
  21. CUR_ACCOUNT CURSOR FOR SELECT
  22. COLUMN_NAME
  23. FROM
  24. INFORMATION_SCHEMA.COLUMNS
  25. WHERE
  26. TABLE_NAME = 'AR_CALC_BONUS_BS_DETAIL'
  27. AND TABLE_SCHEMA = 'aikang_db_28'
  28. AND COLUMN_NAME NOT IN ( 'CALC_YEAR', 'CALC_MONTH', 'P_CALC_MONTH', 'CREATED_AT', 'ID', 'LAYER' )
  29. AND DATA_TYPE IN ( 'DECIMAL', 'DOUBLE', 'INT' );-- 将结束标志绑定到游标
  30. DECLARE
  31. CONTINUE HANDLER FOR NOT FOUND
  32. SET DONE = TRUE;
  33. START TRANSACTION;
  34. SELECT
  35. AP.IS_MONTH,
  36. AP.IS_SENT INTO MISMONTH,
  37. MISSEND
  38. FROM
  39. AR_PERIOD AP
  40. WHERE
  41. AP.PERIOD_NUM = PCPID;-- 查看是否月结
  42. IF
  43. ( MISMONTH = 0 OR MISSEND = 1 ) THEN
  44. LEAVE LABEL;
  45. END IF;-- 打开游标
  46. DELETE
  47. FROM
  48. AR_CALC_BONUS_BS_CHECKING
  49. WHERE
  50. PERIOD_NUM >= PCPID;
  51. OPEN CUR_ACCOUNT;-- 遍历
  52. READ_LOOP :
  53. LOOP-- 取值 取多个字段
  54. FETCH NEXT
  55. FROM
  56. CUR_ACCOUNT INTO MCOLUMNNAME;
  57. IF
  58. DONE THEN
  59. LEAVE READ_LOOP;
  60. END IF;
  61. SET SQL_FOR_SELECT = CONCAT(
  62. "SELECT COUNT(*) INTO @MVALUES0 FROM (SELECT IFNULL(A1.USER_ID,'-1') MAIN_ID,IFNULL(A2.USER_ID,'-1') TEST_ID,IFNULL(A1.",
  63. MCOLUMNNAME,
  64. ",0) NAME1,IFNULL(A2.",
  65. MCOLUMNNAME,
  66. ",0) NAME2 FROM AR_CALC_BONUS_BS_DETAIL A1 LEFT JOIN AR_CALC_BONUS_BS_DETAIL_CALC A2 ON A1.USER_ID = A2.USER_ID WHERE A1.PERIOD_NUM = ",
  67. PCPID,
  68. " AND A2.PERIOD_NUM = ",
  69. PCPID,
  70. " UNION SELECT IFNULL(A2.USER_ID,'-1') MAIN_ID,IFNULL(A1.USER_ID,'-1') TEST_ID,IFNULL(A2.",
  71. MCOLUMNNAME,
  72. ",0) NAME1,IFNULL(A1.",
  73. MCOLUMNNAME,
  74. ",0) NAME2 FROM AR_CALC_BONUS_BS_DETAIL_CALC A1 LEFT JOIN AR_CALC_BONUS_BS_DETAIL A2 ON A1.USER_ID = A2.USER_ID WHERE A1.PERIOD_NUM = ",
  75. PCPID,
  76. " AND A2.PERIOD_NUM = ",
  77. PCPID,
  78. ") B WHERE B.MAIN_ID != B.TEST_ID OR ABS(B.NAME1-B.NAME2)>0.5"
  79. );-- 拼接查询SQL语句
  80. SET @SQL = SQL_FOR_SELECT;
  81. PREPARE STMT
  82. FROM
  83. @SQL;-- 预处理动态SQL语句
  84. EXECUTE STMT;-- 执行SQL语句
  85. DEALLOCATE PREPARE STMT;
  86. SET MVALUES0 := @MVALUES0;
  87. SET SQL_FOR_SELECT = CONCAT( "SELECT IFNULL(SUM(", MCOLUMNNAME, "),0) INTO @MVALUES1 FROM AR_CALC_BONUS_BS_DETAIL WHERE PERIOD_NUM = '", PCPID, "'" );-- 拼接查询SQL语句
  88. SET @SQL = SQL_FOR_SELECT;
  89. PREPARE STMT
  90. FROM
  91. @SQL;-- 预处理动态SQL语句
  92. EXECUTE STMT;-- 执行SQL语句
  93. DEALLOCATE PREPARE STMT;
  94. SET MVALUES1 := @MVALUES1;
  95. SET SQL_FOR_SELECT = CONCAT( "SELECT IFNULL(SUM(", MCOLUMNNAME, "),0) INTO @MVALUES2 FROM AR_CALC_BONUS_BS_DETAIL_CALC WHERE USER_ID != '0' AND PERIOD_NUM = '", PCPID, "'" );-- 拼接查询SQL语句
  96. SET @SQL = SQL_FOR_SELECT;
  97. PREPARE STMT
  98. FROM
  99. @SQL;-- 预处理动态SQL语句
  100. EXECUTE STMT;-- 执行SQL语句
  101. DEALLOCATE PREPARE STMT;
  102. SET MVALUES2 := @MVALUES2;
  103. INSERT INTO AR_CALC_BONUS_BS_CHECKING ( PERIOD_NUM, COLUMN_NAME, DIFF_COUNT, MAIN_SUM, CALC_SUM, DIFF_SUM )
  104. VALUES
  105. (
  106. PCPID,
  107. MCOLUMNNAME,
  108. MVALUES0,
  109. MVALUES1,
  110. MVALUES2,
  111. ABS(
  112. CONVERT (
  113. MVALUES1,
  114. DECIMAL ( 12, 2 ))- CONVERT (
  115. MVALUES2,
  116. DECIMAL ( 12, 2 ))));
  117. COMMIT;
  118. END LOOP;
  119. CLOSE CUR_ACCOUNT;
  120. SELECT
  121. COUNT(*) INTO MCOUNT
  122. FROM
  123. AR_CALC_BONUS_BS_CHECKING
  124. WHERE
  125. ( DIFF_COUNT > 0 OR DIFF_SUM >= 1 )
  126. AND COLUMN_NAME IN (
  127. 'USER_TYPE10',
  128. 'USER_TYPE',
  129. 'BONUS10',
  130. 'BONUS20',
  131. 'BONUS30',
  132. 'BONUS40',
  133. 'BONUS50',
  134. 'BONUS60',
  135. 'BONUS70',
  136. 'BONUS80',
  137. 'BONUS90',
  138. 'BONUS100',
  139. 'BONUS110',
  140. 'ORI_BONUS',
  141. 'AMOUNT',
  142. 'PRODUCT_POINT'
  143. );
  144. IF
  145. ( MCOUNT = 0 ) THEN
  146. UPDATE AR_CALC_BONUS_BS_STAT T
  147. SET T.CHECK_STATUS = 1
  148. WHERE
  149. T.PERIOD_NUM = PCPID;
  150. END IF;
  151. COMMIT;
  152. END
  153. ;
  154. ;;