pivot ora-56901

r29
Дата: 16.09.2015 18:29:36
возникла проблема,

если при использовании pivot пишем дату, то нормально
IN(to_date('01.09.2015', 'dd.mm.yyyy') p1, add_months(to_date('01.09.2015', 'dd.mm.yyyy'),-1) p2)

если v_dt := to_date('01.09.2015', 'dd.mm.yyyy');
IN(v_dt p1, add_months(v_dt, -1) p2), то получаем ora-56901
дата v_dt на входе может быть разная, как можно решить проблему ?
-2-
Дата: 16.09.2015 18:59:59
r29,

case
orawish
Дата: 16.09.2015 19:02:26
r29,

трудно угадать, что именно вы пишете
во всяком случае - всё, что привели в стартовом посте синтаксически неверно
bishnike
Дата: 16.09.2015 19:54:43
orawish,

а что там неверно?
да и догадаться не так уж сложно что ТС хочет, "v_dt" => PL/SQL, а => "это параметризованный pivot"

+ сняв многострочный комментарий получаем целевую ora-56901
declare
  l_meas_for_dt NUMBER;
  l_meas_for_dt_am NUMBER;
  
  p_dt DATE := date'2015-01-01';
begin
 
  with w_t as (
    select date'2015-01-01' as dt, 100 meas from dual
    union all
    select date'2015-01-01' as dt, 200 meas from dual
    union all
    select date'2015-02-01' as dt, 200 meas from dual
    union all
    select date'2015-02-01' as dt, 300 meas from dual
    union all
    select date'2015-03-01' as dt, 400 meas from dual
    union all
    select date'2015-03-01' as dt, 500 meas from dual
  )
  select 
    dt,
    dt_am
  into l_meas_for_dt, l_meas_for_dt_am 
  from
    (select dt, meas from w_t)
  pivot(
    sum(meas) for dt in (
      /*p_dt as dt, --*/date'2015-01-01' as dt,
      /*add_months(p_dt, 1) as dt_am --*/add_months(date'2015-01-01', 1) as dt_am 
    )
  );
  
  dbms_output.put_line(l_meas_for_dt || ', ' || l_meas_for_dt_am); 
end;
Как это можно обойти через
-2-
case
вот это вопрос :) Я уже не успеваю :D


P.S. "скорый поезд к дому мчится" (с)
r29
Дата: 16.09.2015 21:22:34
bishnike, да примерно такой код, некогда было пример
написать абстрактный
r29
Дата: 16.09.2015 21:27:36
решение есть без pivot, но плюс временная таблица, кода больше, хотелось красивее написать просто
r29
Дата: 16.09.2015 22:37:24
неудобно немного удаленно к базе заходить, но если на пальцах - имеем данные за 3 года:
id dt suma
1 01.09.2015 10
1 01.08.2015 200
1 01.07.2015 150
...

результат должен быть строкой - глубина расчета 6 месяцев, стартовая дата для расчета v_dt
id v_dt p1 p2 p3 p4 p5 p6
1 01.09.2015 10 200 150 ...
1 01.08.2015 200 150 ...
1 01.07.2015 150 ...
r29
Дата: 17.09.2015 10:01:01
переписал без pivot, неактуально
bishnike
Дата: 17.09.2015 16:09:32
r29,

что у вас там неаккуратно? какие-то временные таблицы, непонятно же

+ оцените аккуратность от 0 (ужас) до 10 (глаза заказываются)
declare
  l_meas_for_dt_am0 NUMBER;
  l_meas_for_dt_am1 NUMBER;
  l_meas_for_dt_am2 NUMBER;
  v_dt DATE := date'2015-01-01';
begin
  with w_t as (
    select date'2015-01-01' as dt, 100 as meas from dual union all
    select date'2015-01-01' as dt, 200 as meas from dual union all
    select date'2015-02-01' as dt, 200 as meas from dual union all
    select date'2015-02-01' as dt, 300 as meas from dual union all
    select date'2015-03-01' as dt, 400 as meas from dual union all
    select date'2015-03-01' as dt, 500 as meas from dual
  )
  select 
    sum(case when dt = add_months(v_dt, 0) then meas else 0 end), -- фиктивное выравнивание для повышения аккуратности :)
    sum(case when dt = add_months(v_dt, 1) then meas else 0 end),
    sum(case when dt = add_months(v_dt, 2) then meas else 0 end)
    /*...*/ 
  into l_meas_for_dt_am0, l_meas_for_dt_am1, l_meas_for_dt_am2
  from
    w_t;
  
  dbms_output.put_line(l_meas_for_dt_am0 || ', ' || l_meas_for_dt_am1 || ', ' || l_meas_for_dt_am2); 
end;
ArtNick
Дата: 17.09.2015 18:20:28
bishnike,
11