| | 45 | WITH policy_type_map AS ( |
| | 46 | SELECT |
| | 47 | p.p_id, |
| | 48 | EXTRACT(YEAR FROM p.sdate) AS policy_year, |
| | 49 | CASE |
| | 50 | WHEN ap.a_id IS NOT NULL THEN 'Auto' |
| | 51 | WHEN tp.tr_id IS NOT NULL THEN 'Travel' |
| | 52 | WHEN pp.pr_id IS NOT NULL THEN 'Property' |
| | 53 | ELSE 'Other' |
| | 54 | END AS policy_type, |
| | 55 | pkg.total AS insured_value |
| | 56 | FROM |
| | 57 | project.Policy p |
| | 58 | LEFT JOIN project.auto_pol ap ON p.p_id = ap.pol_id |
| | 59 | LEFT JOIN project.Travel_pol tp ON p.p_id = tp.pol_id |
| | 60 | LEFT JOIN project.Property_pol pp ON p.p_id = pp.pol_id |
| | 61 | LEFT JOIN project.Package pkg ON p.package = pkg.code |
| | 62 | ), |
| | 63 | payments_per_policy AS ( |
| | 64 | SELECT |
| | 65 | policy, |
| | 66 | SUM(p_amount) AS total_payment |
| | 67 | FROM project.Payment |
| | 68 | GROUP BY policy |
| | 69 | ), |
| | 70 | combined AS ( |
| | 71 | SELECT |
| | 72 | ptm.policy_year, |
| | 73 | ptm.policy_type, |
| | 74 | ptm.p_id, |
| | 75 | ptm.insured_value, |
| | 76 | COALESCE(pp.total_payment, 0) AS payment |
| | 77 | FROM policy_type_map ptm |
| | 78 | LEFT JOIN payments_per_policy pp ON ptm.p_id = pp.policy |
| | 79 | ), |
| | 80 | final_aggregation AS ( |
| | 81 | SELECT |
| | 82 | policy_year, |
| | 83 | policy_type, |
| | 84 | COUNT(p_id) AS total_policies, |
| | 85 | SUM(insured_value) AS total_insured_value, |
| | 86 | SUM(payment) AS total_revenue, |
| | 87 | ROUND(AVG(payment), 2) AS avg_revenue_per_policy |
| | 88 | FROM combined |
| | 89 | GROUP BY policy_year, policy_type |
| | 90 | ) |
| 46 | | DATE_TRUNC('month', pay.p_date) AS Payment_Month, |
| 47 | | pkg.title AS Package_Title, |
| 48 | | pkg.type_pol AS Policy_Type, |
| 49 | | COUNT(pay.payment_num) AS Total_Payments, |
| 50 | | SUM(pay.p_amount) AS Total_Revenue, |
| 51 | | AVG(pay.p_amount) AS Average_Payment |
| 52 | | FROM |
| 53 | | project.Package pkg |
| 54 | | JOIN |
| 55 | | project.Policy p ON pkg.code = p.package |
| 56 | | JOIN |
| 57 | | project.Payment pay ON p.p_id = pay.policy |
| 58 | | GROUP BY |
| 59 | | Payment_Month, pkg.title, pkg.type_pol |
| 60 | | ORDER BY |
| 61 | | Payment_Month DESC, Total_Revenue DESC; |
| 62 | | |
| | 92 | policy_year, |
| | 93 | policy_type, |
| | 94 | total_policies, |
| | 95 | total_insured_value, |
| | 96 | total_revenue, |
| | 97 | avg_revenue_per_policy |
| | 98 | FROM final_aggregation |
| | 99 | ORDER BY policy_year DESC, policy_type; |