25.01.2014

Особенность функции PIVOT


Для облегчения запросов предварительно выполним
alter session set NLS_DATE_LANGUAGE = RUSSIAN
Положим, в текущем месяце мы сделали 5 и 8 скворечников, а в следующем сделаем -5 и -8.
select pk,
         initcap(to_char(pivot_key, 'MONTH')) pivot_key,
         sum(value) value
    from (select 1 pk, sysdate pivot_key, 5 value from dual
          union
          select 1, sysdate, 8 from dual
          union
          select 1, sysdate + 31, -5 from dual
          union
          select 1, sysdate + 31, -8 from dual)
   group by pk, initcap(to_char(pivot_key, 'MONTH'))
Развернем выборку, задав месяцы как колонки:
with a as
 (select pk,
         initcap(to_char(pivot_key, 'MONTH')) pivot_key,
         sum(value) value
    from (select 1 pk, sysdate pivot_key, 5 value from dual
          union
          select 1, sysdate, 8 from dual
          union
          select 1, sysdate + 31, -5 from dual
          union
          select 1, sysdate + 31, -8 from dual)
   group by pk, initcap(to_char(pivot_key, 'MONTH'))
 )
select pk, "'Январь'_MON" Jan, 
           "'Февраль'_MON" Feb
  from (select *
          from a pivot(sum(value) mon 
          FOR pivot_key IN('Январь',
                           'Февраль')
       )
);
PK        JAN        FEB
---------- ---------- ----------
         1   
Как видим, результат неверный. Обозначим месяц по-другому.
with a as
 (select pk,
         to_char(pivot_key, 'MM') pivot_key,
         sum(value) value
    from (select 1 pk, sysdate pivot_key, 5 value from dual
          union
          select 1, sysdate, 8 from dual
          union
          select 1, sysdate + 31, -5 from dual
          union
          select 1, sysdate + 31, -8 from dual)
   group by pk, to_char(pivot_key, 'MM')
 )
select pk, "'01'_MON" Jan, 
           "'02'_MON" Feb
  from (select *
          from a pivot(sum(value) mon 
          FOR pivot_key IN('01',
                           '02')
       )
);
PK        JAN        FEB
---------- ---------- ----------
         1         13        -13 
Непонятно, в чем причина ошибки, но точно не в кириллических названиях.
Вывод: для опорного поля в функции PIVOT использовать максимально простые, желательно циферные, псевдонимы.

14.01.2014

Описательные гибкие поля (DF) и OAF

Descriptive Flex Fields (описательные ГП) - инструмент в среде OeBS для универсализации использования одних и тех же полей таблиц для хранения свойств разных сущностей. Обычно это набор полей ATTRIBUTE1..ATTRIBUTE15 varchar2(150) для хранения свойств и поле ATTRIBUTE_CATEGORY для хранения контекста. В зависимости от контекста одно и то же поле может иметь разный бизнес-смысл.