WITH opv AS (
SELECT 
/*ВСЕГО В ВОЗРАСТЕ 18 ЛЕТ И СТАРШЕ*/
       zp.sumv AS all_pred, 
       zp.spolis || zp.npolis AS all_pred_p,
       zp.sump + NVL(zp.sump_pod, 0) AS all_opl,
       CASE WHEN zp.sump > 0 THEN zp.spolis || zp.npolis ELSE NULL END all_opl_p,
/*МУЖЧИНЫ*/
       CASE WHEN zp.w = 1 THEN zp.sumv ELSE 0 END m_pred,
       CASE WHEN zp.w = 1 THEN zp.spolis || zp.npolis ELSE NULL END m_pred_p,
       CASE WHEN zp.w = 1 THEN zp.sump + NVL(zp.sump_pod, 0) ELSE 0 END m_opl,
       CASE WHEN zp.w = 1 AND zp.sump > 0 THEN zp.spolis || zp.npolis ELSE NULL END m_opl_p,
/*МУЖЧИНЫ 65 ЛЕТ*/
       CASE WHEN zp.w = 1 AND TRUNC(MONTHS_BETWEEN(zp.date_z_1, zp.dr) / 12) = 65 THEN zp.sumv ELSE 0 END m65_pred,
       CASE WHEN zp.w = 1 AND TRUNC(MONTHS_BETWEEN(zp.date_z_1, zp.dr) / 12) = 65 THEN zp.spolis || zp.npolis ELSE NULL END m65_pred_p,
       CASE WHEN zp.w = 1 AND TRUNC(MONTHS_BETWEEN(zp.date_z_1, zp.dr) / 12) = 65 AND zp.sump > 0 THEN zp.sump + NVL(zp.sump_pod, 0) ELSE 0 END m65_opl,
       CASE WHEN zp.w = 1 AND TRUNC(MONTHS_BETWEEN(zp.date_z_1, zp.dr) / 12) = 65 AND zp.sump > 0 THEN zp.spolis || zp.npolis ELSE NULL END m65_opl_p,
/*МУЖЧИНЫ СТАРШЕ 65 ЛЕТ*/
       CASE WHEN zp.w = 1 AND TRUNC(MONTHS_BETWEEN(zp.date_z_1, zp.dr) / 12) > 65 THEN zp.sumv ELSE 0 END m66_pred,
       CASE WHEN zp.w = 1 AND TRUNC(MONTHS_BETWEEN(zp.date_z_1, zp.dr) / 12) > 65 THEN zp.spolis || zp.npolis ELSE NULL END m66_pred_p,
       CASE WHEN zp.w = 1 AND TRUNC(MONTHS_BETWEEN(zp.date_z_1, zp.dr) / 12) > 65 AND zp.sump > 0 THEN zp.sump + NVL(zp.sump_pod, 0) ELSE 0 END m66_opl,
       CASE WHEN zp.w = 1 AND TRUNC(MONTHS_BETWEEN(zp.date_z_1, zp.dr) / 12) > 65 AND zp.sump > 0 THEN zp.spolis || zp.npolis ELSE NULL END m66_opl_p,
/*ЖЕНЩИНЫ*/
       CASE WHEN zp.w = 2 THEN zp.sumv ELSE 0 END w_pred,
       CASE WHEN zp.w = 2 THEN zp.spolis || zp.npolis ELSE NULL END w_pred_p,
       CASE WHEN zp.w = 2 THEN zp.sump + NVL(zp.sump_pod, 0) ELSE 0 END w_opl,
       CASE WHEN zp.w = 2 AND zp.sump > 0 THEN zp.spolis || zp.npolis ELSE NULL END w_opl_p,
/*ЖЕНЩИНЫ 65 ЛЕТ*/
       CASE WHEN zp.w = 2 AND TRUNC(MONTHS_BETWEEN(zp.date_z_1, zp.dr) / 12) = 65 THEN zp.sumv ELSE 0 END w65_pred,
       CASE WHEN zp.w = 2 AND TRUNC(MONTHS_BETWEEN(zp.date_z_1, zp.dr) / 12) = 65 THEN zp.spolis || zp.npolis ELSE NULL END w65_pred_p,
       CASE WHEN zp.w = 2 AND TRUNC(MONTHS_BETWEEN(zp.date_z_1, zp.dr) / 12) = 65 AND zp.sump > 0 THEN zp.sump + NVL(zp.sump_pod, 0) ELSE 0 END w65_opl,
       CASE WHEN zp.w = 2 AND TRUNC(MONTHS_BETWEEN(zp.date_z_1, zp.dr) / 12) = 65 AND zp.sump > 0 THEN zp.spolis || zp.npolis ELSE NULL END w65_opl_p,
/*ЖЕНЩИНЫ СТАРШЕ 65 ЛЕТ*/
       CASE WHEN zp.w = 2 AND TRUNC(MONTHS_BETWEEN(zp.date_z_1, zp.dr) / 12) > 65 THEN zp.sumv ELSE 0 END w66_pred,
       CASE WHEN zp.w = 2 AND TRUNC(MONTHS_BETWEEN(zp.date_z_1, zp.dr) / 12) > 65 THEN zp.spolis || zp.npolis ELSE NULL END w66_pred_p,
       CASE WHEN zp.w = 2 AND TRUNC(MONTHS_BETWEEN(zp.date_z_1, zp.dr) / 12) > 65 AND zp.sump > 0 THEN zp.sump + NVL(zp.sump_pod, 0) ELSE 0 END w66_opl,
       CASE WHEN zp.w = 2 AND TRUNC(MONTHS_BETWEEN(zp.date_z_1, zp.dr) / 12) > 65 AND zp.sump > 0 THEN zp.spolis || zp.npolis ELSE NULL END w66_opl_p
FROM mtr.s19_zap zp,
     mtr.s19_schet s
WHERE s.year = $SY$ AND s.month <= $EM$ AND s.disp = 'ОПВ' AND s.plat = 53009 AND
      s.code = zp.code)
      
SELECT 'Всего взрослых' AS "Группы",
       SUM(o.all_pred) / 1000 AS "Всего предъявлено к оплате",
       COUNT(DISTINCT o.all_pred_p) AS "Всего человек по предъявленным",
       SUM(o.all_opl) / 1000 AS "Всего оплачено",
       COUNT(DISTINCT o.all_opl_p) AS "Всего человек по оплаченым"
FROM opv o

UNION ALL

SELECT 'мужчины' AS "Группы",
       SUM(o.m_pred) / 1000 AS "Всего предъявлено к оплате",
       COUNT(DISTINCT o.m_pred_p) AS "Всего человек по предъявленным",
       SUM(o.m_opl) / 1000 AS "Всего оплачено",
       COUNT(DISTINCT o.m_opl_p) AS "Всего человек по оплаченым"
FROM opv o

UNION ALL

SELECT 'мужчины 65 лет' AS "Группы",
       SUM(o.m65_pred) / 1000 AS "Всего предъявлено к оплате",
       COUNT(DISTINCT o.m65_pred_p) AS "Всего человек по предъявленным",
       SUM(o.m65_opl) / 1000 AS "Всего оплачено",
       COUNT(DISTINCT o.m65_opl_p) AS "Всего человек по оплаченым"
FROM opv o

UNION ALL

SELECT 'мужчины старше 65 лет' AS "Группы",
       SUM(o.m66_pred) / 1000 AS "Всего предъявлено к оплате",
       COUNT(DISTINCT o.m66_pred_p) AS "Всего человек по предъявленным",
       SUM(o.m66_opl) / 1000 AS "Всего оплачено",
       COUNT(DISTINCT o.m66_opl_p) AS "Всего человек по оплаченым"
FROM opv o

UNION ALL

SELECT 'женщины' AS "Группы",
       SUM(o.w_pred) / 1000 AS "Всего предъявлено к оплате",
       COUNT(DISTINCT o.w_pred_p) AS "Всего человек по предъявленным",
       SUM(o.w_opl) / 1000 AS "Всего оплачено",
       COUNT(DISTINCT o.w_opl_p) AS "Всего человек по оплаченым"
FROM opv o

UNION ALL

SELECT 'женщины 65 лет' AS "Группы",
       SUM(o.w65_pred) / 1000 AS "Всего предъявлено к оплате",
       COUNT(DISTINCT o.w65_pred_p) AS "Всего человек по предъявленным",
       SUM(o.w65_opl) / 1000 AS "Всего оплачено",
       COUNT(DISTINCT o.w65_opl_p) AS "Всего человек по оплаченым"
FROM opv o

UNION ALL

SELECT 'женщины старше 65 лет' AS "Группы",
       SUM(o.w66_pred) / 1000 AS "Всего предъявлено к оплате",
       COUNT(DISTINCT o.w66_pred_p) AS "Всего человек по предъявленным",
       SUM(o.w66_opl) / 1000 AS "Всего оплачено",
       COUNT(DISTINCT o.w66_opl_p) AS "Всего человек по оплаченым"
FROM opv o
