Загрузка данных


WITH x AS (
    SELECT lr.id lr_id,
           lo.patient_id p_id,
           lo.source_org_id org_id,
           o.text org_name,
           lo.source_dep_id dep_id,
           d.text dep_name,
           s.id serv_id,
           s.code serv_code,
           s.text serv_name,
           CASE
               WHEN p.birth_date IS NULL THEN 'unknown'
               WHEN EXTRACT(YEAR FROM ls.collect_date) - EXTRACT(YEAR FROM p.birth_date)
                    - CASE WHEN TO_CHAR(ls.collect_date, 'MMDD') < TO_CHAR(p.birth_date, 'MMDD')
                           THEN 1 ELSE 0 END < 18 THEN 'child'
               ELSE 'adult'
           END age_group
    FROM nlab.lab_research lr
    JOIN nlab.lab_sample ls ON ls.id = lr.lab_sample_id
    JOIN nlab.lab_order lo ON lo.id = ls.lab_order_id
    LEFT JOIN nlab.patient p ON p.id = lo.patient_id
    LEFT JOIN nlab.serv s ON s.id = lr.serv_id
    LEFT JOIN nlab.organization o ON o.id = lo.source_org_id
    LEFT JOIN nlab.dep d ON d.id = lo.source_dep_id
    WHERE ls.collect_date >= DATE '2026-01-01'
      AND ls.collect_date < DATE '2027-01-01'
      AND COALESCE(lr.cancel_status, 0) = 0
      AND COALESCE(ls.cancel_status, 0) = 0
      AND (UPPER(o.text) LIKE '%ПЕРИНАТАЛЬНЫЙ ЦЕНТР № 10%'
           OR d.text = 'РД 10'
           OR d.text LIKE 'РД 10 %')
)
SELECT org_id, org_name, dep_id, dep_name,
       serv_id, serv_code, serv_name,
       COUNT(*) research_count,
       SUM(CASE WHEN age_group = 'child' THEN 1 ELSE 0 END) child_count,
       SUM(CASE WHEN age_group = 'adult' THEN 1 ELSE 0 END) adult_count,
       SUM(CASE WHEN age_group = 'unknown' THEN 1 ELSE 0 END) unknown_count,
       COUNT(DISTINCT p_id) patient_count
FROM x
GROUP BY org_id, org_name, dep_id, dep_name, serv_id, serv_code, serv_name
ORDER BY dep_name, serv_name;