Advertisement
Guest User

Untitled

a guest
Mar 22nd, 2018
103
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. set search_path = _00000003, public;
  2.  
  3. explain(analyze, buffers)
  4.  
  5. WITH
  6. kpi_params as (
  7.     SELECT "@KPI"  
  8.          , "SysName"
  9.       FROM "KPI"
  10.      WHERE "SysName"   IN ('Счета', 'Реализации', 'Оплаты')
  11.        AND "ItemType"   = 2
  12.        AND "$Черновик" IS NULL
  13.        AND "Flags"[4]
  14.      ORDER BY "SysName"
  15. )
  16.  
  17. , empl_cat_filter AS (
  18.    
  19. SELECT UNNEST(ARRAY[21018598, 22087335, 2062745, 2298629, 23428910]) AS "Лицо",
  20. UNNEST(ARRAY[21608304, 21608304,21608304, 21608304, NULL]::INTEGER[]) AS "Раздел",
  21. UNNEST(ARRAY[TRUE, TRUE, NULL, NULL, NULL]) AS "Раздел@"
  22.    
  23.        )
  24.  
  25.     -- Иерархия по отделам с учетом областей видимости (см. startDeptFilter)
  26.    , dept AS (
  27.         WITH RECURSIVE sp AS (
  28.             SELECT x."@Лицо" "Лицо"
  29.                  , x."Раздел"
  30.                  , x."Название"
  31.                  , x."Раздел@"
  32.                  , x."Тип"
  33.               FROM "СтруктураПредприятия" x
  34.              WHERE x."Флаги"[1] is false AND
  35.                    (x."Тип" = 0 OR x."Тип" = 5)
  36.                     AND "Раздел" IS NULL
  37.              UNION ALL
  38.             SELECT z."@Лицо" "Лицо"
  39.                  , z."Раздел"
  40.                  , z."Название"
  41.                  , z."Раздел@"
  42.                  , z."Тип"
  43.               FROM "СтруктураПредприятия" z
  44.              INNER JOIN sp y ON z."Раздел" = y."Лицо" AND z."Тип" = y."Тип"
  45.              WHERE z."Флаги"[1] is false AND
  46.                    z."$Черновик" IS NULL AND z."ДатаЗакрытия" IS NULL)
  47.         SELECT "Лицо", "Раздел", "Название", "Раздел@" FROM sp),
  48.  
  49.     -- Сотрудники отделов
  50.     deptUsers AS (
  51.         SELECT
  52.             (sv)."ЧастноеЛицо" "Лицо"
  53.             ,
  54.                 (sv)."СтруктураПредприятия",
  55.                 (
  56.                     SELECT coalesce(p."Фамилия" || ' ', '') || coalesce(substr(p."Имя", 1, 1) || '.', '') || coalesce(substr(p."Отчество", 1, 1)  || '.', '' )
  57.                     FROM
  58.                         "ЧастноеЛицо" p
  59.                     WHERE
  60.                         (sv)."ЧастноеЛицо" = p."@Лицо"
  61.                 ) "Название"
  62.            
  63.         FROM (
  64.             SELECT "Лицо" "ЧастноеЛицо", "Раздел" "СтруктураПредприятия" from
  65.                 empl_cat_filter
  66.         ) as sv
  67.        
  68.          
  69.  
  70.  
  71.     )
  72.  
  73. -- Сотрудники и отделы
  74. , clientDeptAndUsers AS ( -- не preson
  75.     SELECT "Лицо"
  76.          , "Раздел"
  77.          , "Название"
  78.          , "Раздел@"
  79.  
  80.       FROM dept
  81.      UNION ALL
  82.     SELECT "Лицо"
  83.          , "СтруктураПредприятия" "Раздел"
  84.          , "Название"
  85.          , false "Раздел@"
  86.       FROM deptUsers)
  87.  
  88.  
  89. ,  kpi_data AS ( --userStat
  90.     SELECT s."Person"                                                           "Лицо"
  91.          , s."Department"                                                       "Раздел"
  92.          , SUM(CASE WHEN kp."SysName" = 'Реализации' THEN s."Value" ELSE 0 END) "ОтгрузкиСумма"
  93.          , SUM(CASE WHEN kp."SysName" = 'Реализации' THEN s."Base"  ELSE 0 END) "ОтгрузкиКоличество"
  94.          , SUM(CASE WHEN kp."SysName" = 'Счета'      THEN s."Value" ELSE 0 END) "СчетаСумма"
  95.          , SUM(CASE WHEN kp."SysName" = 'Счета'      THEN s."Base"  ELSE 0 END) "СчетаКоличество"
  96.          , SUM(CASE WHEN kp."SysName" = 'Оплаты'     THEN s."Value" ELSE 0 END) "ОплатыСумма"
  97.          , SUM(CASE WHEN kp."SysName" = 'Оплаты'     THEN s."Base"  ELSE 0 END) "ОплатыКоличество"
  98.       FROM
  99.       "KPIAgg" s
  100.      INNER JOIN kpi_params kp ON kp."@KPI" = s."KPI"
  101.      WHERE s."Date" BETWEEN '2018-03-01'::DATE AND '2018-03-31'::DATE
  102.        AND s."Person"     IS NOT NULL
  103.      GROUP BY s."Person", s."Department"
  104.      )
  105.  
  106. --select * from kpi_data
  107.            
  108.      
  109. , person_kpi_data AS ( ---personStat
  110.     SELECT DISTINCT
  111.            p."Лицо"
  112.          , p."Раздел"
  113.          , p."Название"
  114.          , p."Раздел@"
  115.          
  116.          , s."ОплатыКоличество"
  117.          , s."ОплатыСумма"
  118.          , s."ОтгрузкиКоличество"
  119.          , s."ОтгрузкиСумма"
  120.          , s."СчетаСумма"
  121.          , s."СчетаКоличество"
  122.       FROM clientDeptAndUsers p
  123.       LEFT JOIN kpi_data s
  124.              ON COALESCE(p."Лицо"  , 0) = COALESCE(s."Лицо"  , 0)
  125.             AND COALESCE(p."Раздел", 0) = COALESCE(s."Раздел", 0))
  126. --select * from person_kpi_data
  127.  
  128.  
  129.            
  130. , stat AS (
  131.     WITH RECURSIVE data AS (
  132.         SELECT x."Лицо"
  133.              , x."Раздел"
  134.              , x."Название"
  135.              , x."Раздел@"
  136.              , x."ОплатыКоличество"
  137.              , x."ОплатыСумма"
  138.              , x."ОтгрузкиКоличество"
  139.              , x."ОтгрузкиСумма"
  140.              , x."СчетаСумма"
  141.              , x."СчетаКоличество"
  142.           FROM person_kpi_data x
  143.          where coalesce("ОплатыКоличество", 0) + coalesce("ОтгрузкиКоличество", 0) + coalesce("СчетаКоличество", 0) > 0
  144.          UNION ALL
  145.         SELECT z."Лицо"
  146.              , z."Раздел"
  147.              , z."Название"
  148.              , z."Раздел@"
  149.              , y."ОплатыКоличество"
  150.              , y."ОплатыСумма"
  151.              , y."ОтгрузкиКоличество"
  152.              , y."ОтгрузкиСумма"
  153.              , y."СчетаСумма"
  154.              , y."СчетаКоличество"
  155.           FROM data y
  156.          INNER JOIN person_kpi_data z
  157.                  ON y."Раздел" = z."Лицо")
  158.     SELECT g."Лицо" "@Лицо"
  159.          , g."Лицо"
  160.          , g."Раздел"
  161.          , g."Название"
  162.          , g."Раздел@"
  163.          , sum("ОплатыКоличество")  ::integer "ОплатыКоличество"
  164.          , sum("ОплатыСумма")       ::float   "ОплатыСумма"
  165.          , sum("ОтгрузкиКоличество")::integer "ОтгрузкиКоличество"
  166.          , sum("ОтгрузкиСумма")     ::float   "ОтгрузкиСумма"
  167.          , sum("СчетаКоличество")   ::integer "СчетаКоличество"
  168.          , sum("СчетаСумма")        ::float   "СчетаСумма"
  169.          , CASE
  170.              WHEN g."Раздел" IS NOT NULL THEN TRUE
  171.              ELSE FALSE
  172.            END hasParent
  173.          , CASE
  174.              WHEN (g."Раздел" IS NULL AND NOT g."Раздел@") THEN 3
  175.              WHEN g."Раздел@" THEN 1
  176.              ELSE 2
  177.            END sort_order
  178.       FROM data g
  179.      WHERE g."Лицо" IS NOT NULL
  180.      GROUP BY g."Лицо", g."Раздел", g."Название", g."Раздел@"  
  181.         )
  182. --select * from stat
  183.        
  184. , result AS (
  185.     SELECT CASE
  186.              WHEN p."@Лицо" IS NOT NULL THEN uuid_generate_v4()::TEXT
  187.              WHEN sp."@Лицо" IS NOT NULL THEN a."@Лицо"::TEXT
  188.              ELSE a."@Лицо"::TEXT
  189.            END           "@Лицо"
  190.          , a."@Лицо"     "Лицо"
  191.          , CASE
  192.              WHEN sp."@Лицо" IS NOT NULL THEN a."@Лицо"
  193.              WHEN p."@Лицо" IS NOT NULL THEN a."Раздел"
  194.            END "СтруктураПредприятия"
  195.          , a."Раздел" "Раздел"
  196.          , a."Раздел@"
  197.          , CASE
  198.              WHEN a."@Лицо" = '-1' THEN a."Название"
  199.              WHEN p."@Лицо" IS NOT NULL THEN TRIM(TRIM(COALESCE(p."Фамилия", '') || ' ' || COALESCE(p."Имя", '')) || ' ' || COALESCE(p."Отчество", ''))
  200.              WHEN sp."@Лицо" IS NOT NULL THEN sp."Название"
  201.            END           "Название"
  202.          , CASE
  203.              WHEN a."@Лицо" = '-1' THEN NULL
  204.              WHEN sp2."@Лицо" IS NULL THEN 'Без подразделения'
  205.              WHEN COALESCE(sp2."Название", '') = '' THEN 'Подразделение без названия'
  206.              ELSE sp2."Название"
  207.            END "НазваниеСП"
  208.          , CASE
  209.              WHEN a."@Лицо" = '-1' THEN NULL
  210.              WHEN sv."@СвязиПользователя" IS NOT NULL AND COALESCE(sv."СтруктураПредприятия", 0) = COALESCE(a."Раздел", 0)
  211.              THEN true ELSE false
  212.            END "ТекущаяСП"
  213.          , a."ОплатыКоличество"
  214.          , a."ОплатыСумма"
  215.          , a."ОтгрузкиКоличество"
  216.          , a."ОтгрузкиСумма"
  217.          , a."СчетаКоличество"
  218.          , a."СчетаСумма"
  219.          , a.sort_order
  220.       FROM stat a
  221.       LEFT JOIN "ЧастноеЛицо"            p ON p."@Лицо"        = a."@Лицо"
  222.       LEFT JOIN "СтруктураПредприятия"  sp ON sp."@Лицо"       = a."@Лицо"
  223.       LEFT JOIN "СвязиПользователя"     sv ON sv."ЧастноеЛицо" = a."@Лицо"
  224.       LEFT JOIN "СтруктураПредприятия" sp2 ON sp2."@Лицо"      = a."Раздел"
  225.      WHERE a."Раздел" IS NULL
  226.        AND a."@Лицо" IS NOT NULL
  227.        AND
  228.          coalesce(a."ОплатыКоличество", 0) + coalesce(a."ОтгрузкиКоличество", 0) + coalesce(a."СчетаКоличество", 0)  > 0
  229.      UNION ALL
  230.     SELECT '-2'                           "@Лицо"
  231.          , -2                             "Лицо"
  232.          , null::integer                  "СтруктураПредприятия"
  233.          , NULL::INTEGER            "Раздел"
  234.          , false                          "Раздел@"
  235.          , null::text                     "Название"
  236.          , null::text                     "НазваниеСП"
  237.          , null::boolean                  "ТекущаяСП"
  238.          , SUM(a."ОплатыКоличество")      "ОплатыКоличество"
  239.          , SUM(a."ОплатыСумма")           "ОплатыСумма"
  240.          , SUM(a."ОтгрузкиКоличество")    "ОтгрузкиКоличество"
  241.          , SUM(a."ОтгрузкиСумма")         "ОтгрузкиСумма"
  242.          , SUM(a."СчетаКоличество")       "СчетаКоличество"
  243.          , SUM(a."СчетаСумма")            "СчетаСумма"
  244.          , 4 sort_order
  245.       FROM stat a
  246.      WHERE a."Раздел" IS NULL
  247.        AND a."@Лицо" IS NOT NULL)
  248.        
  249. select * from result ORDER BY sort_order, "Раздел@", "Название"
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement