diff --git a/pipeline/transform/models/marts/dim_school.sql b/pipeline/transform/models/marts/dim_school.sql index c2fc641..20443dc 100644 --- a/pipeline/transform/models/marts/dim_school.sql +++ b/pipeline/transform/models/marts/dim_school.sql @@ -15,12 +15,31 @@ select s.local_authority_code * 1000 + s.establishment_number as laestab, s.school_name, case - when s.phase is not null and lower(s.phase) != 'not applicable' then s.phase + -- 1. Trust GIAS phase when it's a real value (not the catch-all "Not Applicable") + when s.phase is not null + and lower(trim(s.phase)) not in ('not applicable', '', 'unknown') + then s.phase + -- 2. Infer from statutory age range (independent schools still publish these) when s.statutory_high_age is not null and s.statutory_high_age <= 11 then 'Primary' when s.statutory_low_age is not null and s.statutory_low_age >= 11 then 'Secondary' when s.statutory_low_age is not null and s.statutory_high_age is not null and s.statutory_low_age < 11 and s.statutory_high_age > 11 then 'All-through' - else s.phase + -- 3. Fallback: infer from school name (covers independents with missing ages) + when s.school_name ilike '%primary%' + or s.school_name ilike '%infant%' + or s.school_name ilike '%junior%' + or s.school_name ilike '%preparatory%' + or s.school_name ilike '% prep school%' + or s.school_name ilike '% prep %' + then 'Primary' + when s.school_name ilike '%secondary%' + or s.school_name ilike '%high school%' + or s.school_name ilike '%grammar%' + or s.school_name ilike '%senior school%' + or s.school_name ilike '%upper school%' + then 'Secondary' + -- 4. Give up — leave phase null so the UI renders no pill + else null end as phase, s.school_type, s.academy_trust_name,