Oracle PIVOT, дважды? - PullRequest
       14

Oracle PIVOT, дважды?

2 голосов
/ 07 июля 2010

Я пытался отойти от использования DECODE для поворота строк в Oracle 11g, где есть удобная функция PIVOT.Но я, возможно, нашел ограничение:

Я пытаюсь вернуть 2 столбца для каждого значения в базовой таблице.Что-то вроде:

SELECT somethingId, splitId1, splitName1, splitId2, splitName2
FROM (SELECT somethingId, splitId
      FROM SOMETHING JOIN SPLIT ON ... )
      PIVOT ( MAX(splitId) FOR displayOrder IN (1 AS splitId1, 2 AS splitId2),
              MAX(splitName) FOR displayOrder IN (1 AS splitName1, 2 as splitName2)
            )

Я могу сделать это с DECODE, но я не могу разобраться в синтаксисе, чтобы позволить мне сделать это с PIVOT.Это вообще возможно?Похоже, что функция не будет слишком сложной для обработки.

Правка: может, StackOverflow не подходит для вопросов переполнения для SQL?

Правка: кто-нибудь есть?

Ответы [ 2 ]

2 голосов
/ 09 ноября 2010

С oracle-developer.net может показаться, что это можно сделать так:

SELECT somethingId, splitId1, splitName1, splitId2, splitName2
FROM (SELECT somethingId, splitId
      FROM SOMETHING JOIN SPLIT ON ... )
      PIVOT ( MAX(splitId)  ,
              MAX(splitName) 
              FOR displayOrder IN (1 AS splitName1, 2 as splitName2)
            )
1 голос
/ 09 ноября 2010

Я не уверен из того, что вы предоставили, как выглядят данные или что именно вы хотели бы. Возможно, если вы разместили версию запроса с декодированием, которая возвращает искомые данные и / или определение исходных данных, мы могли бы лучше ответить на ваш вопрос. Примерно так будет полезно:

create table something (somethingId Number(3), displayOrder Number(3)
   , splitID Number(3));            
insert into something values (1, 1, 10);
insert into something values (2, 1, 11);
insert into something values (3, 1, 12);
insert into something values (4, 1, 13);
insert into something values (5, 2, 14);
insert into something values (6, 2, 15);
insert into something values (7, 2, 16);

create table split (SplitID Number(3), SplitName Varchar2(30));
insert into split values (10, 'Bob');
insert into split values (11, 'Carrie');
insert into split values (12, 'Alice');
insert into split values (13, 'Timothy');
insert into split values (14, 'Sue');
insert into split values (15, 'Peter');
insert into split values (16, 'Adam');

SELECT * 
FROM (
   SELECT somethingID, displayOrder, so.SplitID, sp.splitname
      FROM SOMETHING so JOIN SPLIT sp ON so.splitID = sp.SplitID
)
PIVOT ( MAX(splitId) id,  MAX(splitName) name
   FOR (displayOrder, displayOrder) IN ((1, 1) AS split, (2, 2) as splitname)
);
...