Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 PIVOT с подзапросом в IN  [new]
killer_zon
Member

Откуда: город-герой Киев
Сообщений: 81
подскажите пожалуйста как можно в in вставить подзапрос?
нашел решение с pivot xml, но этот способ не удобен в дальнейшем с парсингом.
если с парсингом подскажете, буду очень благодарен.

может мне бы помогла какая-то переменная текстовая, куда вывести результат запроса?
чтоб затолкать туда результат в виде строки и потом подставить в in как текст? (как в примере ниже)
select '''' || (select listagg(ddt, ', ') 
within group (order by ddt) from (select distinct to_char(ddt) AS ddt  from (
    select 1 as bsk, to_date('01.01.2012', 'dd.mm.yyyy') ddt, 23 as smm from dual union all
    select 1 as bsk, to_date('01.02.2012', 'dd.mm.yyyy') ddt, 28 as smm from dual union all
    select 2 as bsk, to_date('01.01.2012', 'dd.mm.yyyy') ddt, 18 as smm from dual union all
    select 2 as bsk, to_date('01.02.2012', 'dd.mm.yyyy') ddt, 3 as smm from dual
  ))) || '''' from dual;



и вот сам запрос, куда хочу подставлять динамические даты

select * from
(
  select 1 as bsk, to_date('01.01.2012', 'dd.mm.yyyy') ddt, 23 as smm from dual union all
  select 1 as bsk, to_date('01.02.2012', 'dd.mm.yyyy') ddt, 28 as smm from dual union all
  select 2 as bsk, to_date('01.01.2012', 'dd.mm.yyyy') ddt, 18 as smm from dual union all
  select 2 as bsk, to_date('01.02.2012', 'dd.mm.yyyy') ddt, 3 as smm from dual
) pivot (sum(smm) for ddt in (to_date('01.01.2012', 'dd.mm.yyyy'), to_date('01.02.2012', 'dd.mm.yyyy')));
------------------
select * from
(
  select 1 as bsk, to_date('01.01.2012', 'dd.mm.yyyy') ddt, 23 as smm from dual union all
  select 1 as bsk, to_date('01.02.2012', 'dd.mm.yyyy') ddt, 28 as smm from dual union all
  select 2 as bsk, to_date('01.01.2012', 'dd.mm.yyyy') ddt, 18 as smm from dual union all
  select 2 as bsk, to_date('01.02.2012', 'dd.mm.yyyy') ddt, 3 as smm from dual
) pivot xml (sum(smm) for ddt in 
(
  select distinct ddt from
  (
    select 1 as bsk, to_date('01.01.2012', 'dd.mm.yyyy') ddt, 23 as smm from dual union all
    select 1 as bsk, to_date('01.02.2012', 'dd.mm.yyyy') ddt, 28 as smm from dual union all
    select 2 as bsk, to_date('01.01.2012', 'dd.mm.yyyy') ddt, 18 as smm from dual union all
    select 2 as bsk, to_date('01.02.2012', 'dd.mm.yyyy') ddt, 3 as smm from dual
  )
)
);


или может такая конструкция, которая выполняет переданный в нее запрос? но нужно, чтоб она как-то выдавала результат
BEGIN
  EXECUTE IMMEDIATE 'select ''aa'' from dual';
END;
18 май 13, 10:53    [14315630]     Ответить | Цитировать Сообщить модератору
 Re: PIVOT с подзапросом в IN  [new]
-2-
Member

Откуда:
Сообщений: 15330
killer_zon
подскажите пожалуйста как можно в in вставить подзапрос?
insert into "in" values('подзапрос');
18 май 13, 12:59    [14315991]     Ответить | Цитировать Сообщить модератору
 Re: PIVOT с подзапросом в IN  [new]
killer_zon
Member

Откуда: город-герой Киев
Сообщений: 81
select * from
(
  select 1 as bsk, to_date('01.01.2012', 'dd.mm.yyyy') ddt, 23 as smm from dual union all
  select 1 as bsk, to_date('01.02.2012', 'dd.mm.yyyy') ddt, 28 as smm from dual union all
  select 2 as bsk, to_date('01.01.2012', 'dd.mm.yyyy') ddt, 18 as smm from dual union all
  select 2 as bsk, to_date('01.02.2012', 'dd.mm.yyyy') ddt, 3 as smm from dual
) pivot (sum(smm) for ddt in ([color=red]to_date('01.01.2012', 'dd.mm.yyyy'), to_date('01.02.2012', 'dd.mm.yyyy')[/color]));


необходимо, чтоб вместо статически вписанной конструкции в выделенной красным цветом области был подзапрос
18 май 13, 13:08    [14316033]     Ответить | Цитировать Сообщить модератору
 Re: PIVOT с подзапросом в IN  [new]
killer_zon
Member

Откуда: город-герой Киев
Сообщений: 81
... in (to_date('01.01.2012', 'dd.mm.yyyy'), to_date('01.02.2012', 'dd.mm.yyyy')) ...
18 май 13, 13:09    [14316043]     Ответить | Цитировать Сообщить модератору
 Re: PIVOT с подзапросом в IN  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10051
killer_zon
необходимо, чтоб вместо статически вписанной конструкции в выделенной красным цветом области был подзапрос


Такое PIVOT поддерживает только для генерации XML. А так - нет. Смотри произвольное число столбцов в конструкции "Pivot" (11g).

SY.

Сообщение было отредактировано: 18 май 13, 15:48
18 май 13, 15:46    [14316416]     Ответить | Цитировать Сообщить модератору
 Re: PIVOT с подзапросом в IN  [new]
killer_zon
Member

Откуда: город-герой Киев
Сообщений: 81
спасибо большое.
если что-то получится сделать на основании этого напишу результат
18 май 13, 18:22    [14316845]     Ответить | Цитировать Сообщить модератору
 Re: PIVOT с подзапросом в IN  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10051
killer_zon
если что-то получится сделать на основании этого напишу результат


Это врядли. Вернее можно но не стоит. Придется писать UDF c ODCI интерфейсом + динамика.

SY.

Сообщение было отредактировано: 18 май 13, 19:57
18 май 13, 19:57    [14317120]     Ответить | Цитировать Сообщить модератору
 Re: PIVOT с подзапросом в IN  [new]
killer_zon
Member

Откуда: город-герой Киев
Сообщений: 81
select 
t.xml.extract('//item[position()=1]/column[position()=1]/text()') case1
--,t.xml.extract('//$i/column[position()=1]/text()') case1
--,t.xml.extract('//word[position()=1]') case2
--,t.xml.extract('//word[@seq=2]/text()') case3
from
(
  select XMLType
  (
  '
    <PivotSet>
      <item>
        <column name = "DDT">2012-01-01</column>
        <column name = "SUM(SMM)">23</column>
      </item>
      <item>
        <column name = "DDT">2012-02-01</column>
        <column name = "SUM(SMM)">28</column>
      </item>
    </PivotSet>
  ') XML
  from dual
) t
,
xmltable
(
  'for $i in /PivotSet
  return $i/item'
  passing t.xml
)


максимум что получилось - разложить снова на строки:)
и то до конца пока не понял, как переменную $i вытащить в xml.extract() функцию
24 май 13, 16:24    [14346186]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить