客户缴费习惯-Proc.sql 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. CREATE
  2. OR REPLACE PROCEDURE shanglifeecif.update_customer_payment_habits() -- 创建主存储过程
  3. IS
  4. BEGIN
  5. UPDATE shanglifeecif.customerno_insurance_policies_info a
  6. SET (
  7. pay_way_num_a,
  8. pay_way_date_a,
  9. pay_way_num_b,
  10. pay_way_date_b,
  11. pay_way_num_c,
  12. pay_way_date_c,
  13. policy_label_8
  14. ) = (select b.pay_way_num_a,
  15. b.pay_way_date_a,
  16. b.pay_way_num_b,
  17. b.pay_way_date_b,
  18. b.pay_way_num_c,
  19. b.pay_way_date_c,
  20. b.policy_label_8
  21. from (SELECT policy_no,
  22. max(CASE WHEN habit = '银行批扣交费' THEN num END) AS pay_way_num_a,
  23. max(CASE WHEN habit = '银行批扣交费' THEN lastpaydate END) AS pay_way_date_a,
  24. max(CASE WHEN habit = '线上交费' THEN num END) AS pay_way_num_b,
  25. max(CASE WHEN habit = '线上交费' THEN lastpaydate END) AS pay_way_date_b,
  26. max(CASE WHEN habit = '对公转账交费' THEN num END) AS pay_way_num_c,
  27. max(CASE WHEN habit = '对公转账交费' THEN lastpaydate END) AS pay_way_date_c,
  28. max(CASE WHEN row_num = 1 THEN habit END) AS policy_label_8
  29. FROM (SELECT habit,
  30. policy_no,
  31. num,
  32. lastpaydate,
  33. ROW_NUMBER() OVER (PARTITION BY policy_no ORDER BY num DESC,lastpaydate desc) AS row_num
  34. FROM ((SELECT CASE
  35. WHEN t.PAYMODE = '4' THEN '银行批扣交费'
  36. WHEN upper(t.PAYMODE) = 'F' THEN '对公转账交费'
  37. WHEN upper(t.PAYMODE) in ('K', 'J') THEN '线上交费'
  38. else '' end as habit,
  39. t.otherno policy_no,
  40. count(1) num,
  41. max(t.makedate) lastpaydate
  42. FROM dsj.ljtempfeeclass t
  43. WHERE t.othernotype = '2'
  44. AND t.paydate >= ADD_MONTHS(SYSDATE, -36)
  45. GROUP BY t.otherno, t.PAYMODE)))
  46. group by policy_no) b
  47. where b.policy_no = a.policy_no)
  48. WHERE 1 = 1;
  49. update shanglifeecif.Individual a
  50. set (Label132) = (select main_payment_period
  51. from (SELECT customer_no,
  52. period_name AS main_payment_period
  53. FROM (
  54. -- 对每个客户的三个时间段排序,取优先级最高的
  55. SELECT customer_no,
  56. period_name,
  57. total_num,
  58. latest_date,
  59. ROW_NUMBER() OVER (
  60. PARTITION BY customer_no
  61. ORDER BY total_num DESC, latest_date DESC
  62. ) AS rn -- 按次数降序、日期降序排序
  63. FROM (
  64. -- 按客户号聚合,将三个时间段转为多行
  65. SELECT customer_no,
  66. '银行批扣交费' AS period_name,
  67. SUM(pay_way_num_a) AS total_num,
  68. MAX(pay_way_date_a) AS latest_date
  69. FROM shanglifeecif.customerno_insurance_policies_info
  70. where pay_way_num_a is not null
  71. GROUP BY customer_no
  72. UNION ALL
  73. -- 12点-18点
  74. SELECT customer_no,
  75. '线上交费' AS period_name,
  76. SUM(pay_way_num_b) AS total_num,
  77. MAX(pay_way_date_b) AS latest_date
  78. FROM shanglifeecif.customerno_insurance_policies_info
  79. where pay_way_num_b is not null
  80. GROUP BY customer_no
  81. UNION ALL
  82. -- 18点以后
  83. SELECT customer_no,
  84. '对公转账交费' AS period_name,
  85. SUM(pay_way_num_c) AS total_num,
  86. MAX(pay_way_date_c) AS latest_date
  87. FROM shanglifeecif.customerno_insurance_policies_info
  88. where pay_way_num_c is not null
  89. GROUP BY customer_no) t1 -- t1:每个客户的三个时间段数据(一行一个时间段)
  90. ) t2 -- t2:对每个客户的三个时间段排序
  91. WHERE rn = 1) b
  92. where a.scustid = b.customer_no)
  93. where 1 = 1;
  94. dbms_output
  95. .
  96. put_line
  97. ('update_customer_payment_habits函数跑批完成!');
  98. EXCEPTION
  99. WHEN HIVE_EXCEPTION THEN
  100. INSERT INTO shanglifeecif.exception_log(log_id,log_code,log_msg,log_time) VALUES (to_char(sysdate(),'yyyyMMddHHmmss'),sqlcode(),sqlerrm(),sysdate());
  101. WHEN Others THEN
  102. INSERT INTO shanglifeecif.exception_log(log_id,log_code,log_msg,log_time) VALUES (to_char(sysdate(),'yyyyMMddHHmmss'),sqlcode(),sqlerrm(),sysdate());
  103. END;