- with full_time as ( --собираем список полей для
- select dy.name::numeric as yr
- ,coalesce(substring(dp.name,'^[0-9]{1}') ,'5') as prd --dp.id::numeric - 1
- ,dp.id::numeric as prd_id
- ,dk.*
- ,case when upper(dk.l3_name) = upper('прочее') then dk.l3_name || ' ' || dk.l2_name else null end cfo_chngd
- from dds.d_year dy
- cross join dds.d_kpi_period dp
- cross join dds.d_kpi dk
- )
- -- ////////////// НАЧАЛО КАСТОМНОЙ ЧАСТИ \\\\\\\\\\\\\\
- ,facts as (
- select ds."year" as yr
- ,ds.quarter as qrt
- ,ds.deal_sum_sald as value
- ,kc.kpi_id as kpi_code
- ,ds.cfo
- from dds.deal_status ds
- left join dds.kpi_code kc
- on trim(lower(ds.deal_id)) = trim(lower(kc.deal_id))
- and trim(ds.cfo) = trim(kc.cfo_name)
- and kc.kpi_id ~ '18\.+'
- where ds.status = 'В портфеле'
- and extract(year from ds.contract_date) = extract(year from now())
- and ds.programm like '%ФНБ%'
- ),
- --////////////////// КОНЕЦ КАСТОМНОЙ ЧАСТИ \\\\\\\\\\\\\\\\
- pre_final as (
- select
- ft.yr,ft.prd,ft.kpi_category
- ,ft.l1_code,ft.l1_name
- ,ft.l2_code,ft.l2_name
- ,ft.l3_code,ft.l3_name
- ,ft.l4_code,ft.l4_name
- ,sum(ts.value/ft.unit_amt::numeric) as fact_amount
- ,ft.unit
- from full_time ft
- left join facts ts
- on 1 = case when ts.kpi_code is null and upper(ft.l3_name) = upper('прочее') and ts.cfo = ft.l2_name then 1 --прочее агрегируются по цфо
- when ts.kpi_code = coalesce(ft.l4_code,ft.l3_code,ft.l2_code,ft.l1_code) then 1 --мапим все записи
- when coalesce(ft.l4_code,ft.l3_code,ft.l2_code,ft.l1_code) = ft.l1_code then 1 --если запись 1 уровня, то собираем всё
- when ts.cfo = coalesce(ft.l3_name,ft.l2_name) then 1 --если запись 2 уровня, то собираем по ЦФО
- else 0 end
- and ft.yr = ts.yr::numeric
- and 1 = case when ft.prd::numeric >= ts.qrt::numeric then 1 --сумма с накоплением по кварталам
- --when ft.prd::numeric = 0 then 1
- else 0 end --агрегация всех записей на строчку года. в справочнике периодов id на год = 1, id кварталов - омер квартала+1
- where ft.l1_code = '18.' --Иного не придумали
- and ft.yr = ts.yr
- group by ft.yr,ft.prd,ft.kpi_category
- ,ft.l1_code,ft.l1_name
- ,ft.l2_code,ft.l2_name
- ,ft.l3_code,ft.l3_name
- ,ft.l4_code,ft.l4_name
- ,ft.unit
- )
- select
- ft.yr,dp.name as prd
- ,ft.l1_name as main_kpi
- ,ft.kpi_category as main_kpi_short
- ,coalesce(ft.l4_code,ft.l3_code,ft.l2_code,ft.l1_code) as kpi_code
- ,coalesce(ft.l4_name,ft.l3_name,ft.l2_name,ft.l1_name) as kpi_name
- ,ft.unit
- ,ft.fact_amount as value_fact
- ,gd.value as value_plan
- from pre_final ft
- join dds.d_kpi_period dp
- on coalesce(substring(dp.name,'^[0-9]{1}'),'5') = ft.prd
- join dds.d_year dy
- on dy."name"::numeric = ft.yr
- join dds.d_kpi gp --для джоина kpi_gd по id
- on coalesce(gp.l4_code,gp.l3_code,gp.l2_code,gp.l1_code) = coalesce(ft.l4_code,ft.l3_code,ft.l2_code,ft.l1_code)
- left join dds.kpi_gd gd --dds.kpi_gd как нормализованная таблица с планом.
- on gd.kpi_gp_id = gp.id
- and 1= case when gd.period_id - 1 = ft.prd::numeric then 1
- when gd.period_id = 1 and ft.prd::numeric = 5 then 1
- else 0 end
- and gd.year_id = dy.id
- and gd.load_id=(select max(load_id) from dds.kpi_gd )
- left join dds.d_kpi_datatype ddt --фильтр по плану
- on gd.datatype_id = ddt.id
- and ddt.id = 1
[text] mrt
Viewer
*** This page was generated with the meta tag "noindex, nofollow". This happened because you selected this option before saving or the system detected it as spam. This means that this page will never get into the search engines and the search bot will not crawl it. There is nothing to worry about, you can still share it with anyone.
Editor
You can edit this paste and save as new: