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


, payments as (
    select
        o.id,
        o.ef_year,
        sum(o.value) as sum_value
    from operations o
    join back_office.operation_type ot
        on ot.id = o.operation_type_id
    where o.deb_mnemonics like '%СВ%'
      and coalesce(o.cred_mnemonics, '') not like '%НДФЛ%'
      and ot.code in (
          'PAYMENT_TERMINATED',
          'PDS_REDEMPTION_PAYMENT',
          'PDS_REDEMPTION_PAYMENT_TO_NPF',
          'PDS_REDEMPTION_LIFELONG_PAYMENT',
          'PDS_REDEMPTION_REDEMPTION_LOSS',
          'PDS_ADDITIONAL_PAYMENT_REDEMPTION',
          'PDS_REP_PAYMENT_TERMINATED',
          'SECOND_PAYMENT_TERMINATED',
          'PDS_RETURN_NDFL_REDEMPTION'
      )
    group by o.id, o.ef_year
),
payment_totals as (
    select
        ef_year,
        count(*) as count_oper,
        sum(sum_value) as sum_value
    from payments
    group by ef_year
),
tax_totals as (
    select
        o.ef_year,
        sum(o.value) as sum_ndfl
    from operations o
    join back_office.operation_type ot
        on ot.id = o.operation_type_id
    where
        -- НДФЛ отдельной операцией, как в текущем примере
        ot.code = 'PDS_NDFL_REDEMPTION_PAYMENT'

        or (
            -- Сохраняем учёт НДФЛ внутри операции выплаты
            o.cred_mnemonics like '%НДФЛ%'
            and exists (
                select 1
                from payments p
                where p.id = o.id
            )
        )
    group by o.ef_year
)
select
    cast(coalesce(p.ef_year, n.ef_year) as varchar(4)) as year_name,
    coalesce(p.count_oper, 0) as count_oper,
    p.sum_value,
    n.sum_ndfl
from payment_totals p
full join tax_totals n
    on n.ef_year = p.ef_year
order by coalesce(p.ef_year, n.ef_year);