| 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; |