QUERY PLAN
Aggregate (cost=6115.28..6115.29 rows=1 width=8)
-> Sort (cost=6085.08..6090.12 rows=2013 width=4240)
Sort Key: c.erp_labor_cost_amount, c.updated_at DESC
-> Subquery Scan on c (cost=2266.36..2306.62 rows=2013 width=4240)
-> HashAggregate (cost=2266.36..2286.49 rows=2013 width=4144)
Group Key: c_1.id
-> Hash Right Join (cost=1005.98..2256.29 rows=2013 width=20)
Hash Cond: ("*SELECT* 1".client_id = c_1.id)
-> GroupAggregate (cost=870.68..2120.37 rows=50 width=12)
Group Key: "*SELECT* 1".client_id
-> Sort (cost=870.68..870.81 rows=50 width=65)
Sort Key: "*SELECT* 1".client_id
-> Nested Loop Left Join (cost=51.46..869.27 rows=50 width=65)
Join Filter: (ps.id = psrr.punch_strategy_id)
-> Hash Left Join (cost=51.46..866.05 rows=50 width=52)
Hash Cond: ("*SELECT* 1".engineer_id = psrr.user_id)
-> Hash Left Join (cost=50.10..864.34 rows=50 width=52)
Hash Cond: (("*SELECT* 1".engineer_id = payroll.user_id) AND ("*SELECT* 1".settle_month = payroll.settle_month))
-> Append (cost=0.29..814.26 rows=50 width=20)
-> Subquery Scan on "*SELECT* 1" (cost=0.29..150.53 rows=6 width=20)
-> Nested Loop Left Join (cost=0.29..150.47 rows=6 width=280)
Filter: (COALESCE(p.client_id, c_2.client_id) IS NOT NULL)
-> Seq Scan on tbl_pre_sales p (cost=0.00..100.53 rows=6 width=28)
Filter: ((start_at IS NOT NULL) AND (end_at IS NOT NULL) AND (engineer_id IS NOT NULL) AND ((NOT is_draft) OR (is_draft IS NULL)) AND (end_at > start_at) AND (start_at >= '2026-01-01 00:00:00+08'::timestamp with time zone) AND (start_at <= '2026-12-31 23:59:59+08'::timestamp with time zone))
-> Index Scan using tbl_cases_pkey on tbl_cases c_2 (cost=0.29..8.30 rows=1 width=8)
Index Cond: (id = p.case_id)
-> Subquery Scan on "*SELECT* 2" (cost=0.29..663.73 rows=44 width=20)
-> Nested Loop (cost=0.29..663.29 rows=44 width=280)
-> Seq Scan on tbl_implement_records i (cost=0.00..392.99 rows=44 width=24)
Filter: ((arrived_at IS NOT NULL) AND (left_at IS NOT NULL) AND ((NOT is_draft) OR (is_draft IS NULL)) AND (left_at > arrived_at) AND (arrived_at >= '2026-01-01 00:00:00+08'::timestamp with time zone) AND (arrived_at <= '2026-12-31 23:59:59+08'::timestamp with time zone))
-> Index Scan using tbl_cases_pkey on tbl_cases c_3 (cost=0.29..6.12 rows=1 width=12)
Index Cond: (id = i.case_id)
Filter: ((last_engineer IS NOT NULL) AND (COALESCE(i.client_id, client_id) IS NOT NULL))
-> Hash (cost=46.82..46.82 rows=200 width=40)
-> Subquery Scan on payroll (cost=42.32..46.82 rows=200 width=40)
-> HashAggregate (cost=42.32..44.82 rows=200 width=40)
Group Key: am.user_id, t.settle_month
-> Append (cost=12.96..40.31 rows=268 width=40)
-> HashAggregate (cost=12.96..15.56 rows=208 width=40)
Group Key: am.user_id, t.settle_month
-> Hash Join (cost=1.31..10.92 rows=271 width=11)
Hash Cond: (am.erp_wage_ticket_id = t.id)
-> Seq Scan on tbl_erp_wage_ticket_amounts am (cost=0.00..8.45 rows=345 width=11)
Filter: (user_id IS NOT NULL)
-> Hash (cost=1.18..1.18 rows=11 width=8)
-> Seq Scan on tbl_erp_wage_tickets t (cost=0.00..1.18 rows=11 width=8)
Filter: (status = 2)
-> HashAggregate (cost=9.96..10.28 rows=26 width=40)
Group Key: am_1.user_id, t_1.settle_month
-> Hash Join (cost=1.14..9.75 rows=27 width=11)
Hash Cond: (am_1.erp_social_insurance_id = t_1.id)
-> Seq Scan on tbl_erp_social_insurance_amounts am_1 (cost=0.00..7.67 rows=267 width=11)
Filter: (user_id IS NOT NULL)
-> Hash (cost=1.12..1.12 rows=1 width=8)
-> Seq Scan on tbl_erp_social_insurances t_1 (cost=0.00..1.12 rows=1 width=8)
Filter: (status = 2)
-> HashAggregate (cost=8.24..8.57 rows=26 width=40)
Group Key: am_2.user_id, t_2.settle_month
-> Hash Join (cost=1.10..8.02 rows=30 width=11)
Hash Cond: (am_2.erp_provident_fund_id = t_2.id)
-> Seq Scan on tbl_erp_provident_fund_amounts am_2 (cost=0.00..6.11 rows=211 width=11)
Filter: (user_id IS NOT NULL)
-> Hash (cost=1.09..1.09 rows=1 width=8)
-> Seq Scan on tbl_erp_provident_funds t_2 (cost=0.00..1.09 rows=1 width=8)
Filter: (status = 2)
-> HashAggregate (cost=3.12..3.22 rows=8 width=40)
Group Key: am_3.user_id, t_3.settle_month
-> Hash Join (cost=1.11..3.06 rows=8 width=14)
Hash Cond: (am_3.erp_personal_tax_id = t_3.id)
-> Seq Scan on tbl_erp_personal_tax_amounts am_3 (cost=0.00..1.68 rows=68 width=14)
Filter: (user_id IS NOT NULL)
-> Hash (cost=1.10..1.10 rows=1 width=8)
-> Seq Scan on tbl_erp_personal_taxs t_3 (cost=0.00..1.10 rows=1 width=8)
Filter: (status = 2)
-> Hash (cost=1.16..1.16 rows=16 width=8)
-> Seq Scan on tbl_punch_strategy_resource_rels psrr (cost=0.00..1.16 rows=16 width=8)
-> Materialize (cost=0.00..1.04 rows=3 width=17)
-> Seq Scan on tbl_punch_strategies ps (cost=0.00..1.03 rows=3 width=17)
SubPlan 1
-> Aggregate (cost=24.94..24.95 rows=1 width=8)
-> Hash Left Join (cost=5.67..23.69 rows=500 width=0)
Hash Cond: ((work_dates.work_date)::date = pss.edate)
Filter: CASE WHEN (ps.id IS NULL) THEN (((date_part('isodow'::text, work_dates.work_date))::integer >= 1) AND ((date_part('isodow'::text, work_dates.work_date))::integer <= 5)) WHEN (pss.id IS NOT NULL) THEN pss.need_work WHEN (ps.legal_holiday AND (lh.id IS NOT NULL)) THEN lh.is_exchange ELSE (((ps.week)::integer & (1 << ((date_part('isodow'::text, work_dates.work_date))::integer - 1))) <> 0) END
-> Hash Left Join (cost=4.29..17.10 rows=1000 width=13)
Hash Cond: ((work_dates.work_date)::date = lh.edate)
-> Function Scan on generate_series work_dates (cost=0.01..10.01 rows=1000 width=8)
-> Hash (cost=2.46..2.46 rows=146 width=9)
-> Seq Scan on tbl_legal_holidays lh (cost=0.00..2.46 rows=146 width=9)
-> Hash (cost=1.36..1.36 rows=1 width=9)
-> Seq Scan on tbl_punch_strategy_schedules pss (cost=0.00..1.36 rows=1 width=9)
Filter: (punch_strategy_id = ps.id)
-> Hash (cost=110.13..110.13 rows=2013 width=12)
-> Seq Scan on tbl_clients c_1 (cost=0.00..110.13 rows=2013 width=12)