2010-07-07 5 views
2

Я пытаюсь отойти от использования DECODE для поворота строк в Oracle 11g, где есть удобная функция PIVOT. Но я, возможно, нашел ограничение:Oracle 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?

Редактировать: кто там?

+0

Ну, там нет да или нет ответа? Я на неправильном форуме для Oracle SQL? – orbfish

+0

До тех пор, пока http://area51.stackexchange.com/proposals/4260/databases или http://area51.stackexchange.com/proposals/6223/oracle-databases созданы, вы находитесь в нужном месте. –

+0

К сожалению, PIVOT является очень новым в Oracle, и кажется, что большинство людей здесь не знают достаточно, чтобы ответить на ваш вопрос. Как вы пробовали отправить на forums.oracle.com? Больше экспертов Oracle идут туда, чем здесь. –

ответ

2

От 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) 
      ) 
+0

Вот и все, забыл принять ранее. Благодаря! – orbfish

1

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

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) 
);