2015-06-22 4 views
0

Я пытаюсь создать Pivot в Oracle. Я получаю сообщение об ошибке,Oracle Pivot Multi Table

ORA-00904: "VALUEZ": недопустимый идентификатор 00904. 00000 - "% S: неверный идентификатор" * Причина:
* Действие: Ошибка в строке: 18 Колонка: 6

Любые мысли?

SELECT * FROM 
(
    SELECT ACC.NBR,CTA.NAMEZ 
    FROM ACCS ACC 
    JOIN CARS CAR ON CAR.CAR_AAD_ID = ACC.ACC_AAD_ID 
    JOIN CTAS CTA ON CAR_CUS_ID = CTA_CUS_ID 
) 
PIVOT 
(
    MAX(VALUEZ) --comes from table CTAS (ERROR LINE) 
    FOR NAMEZ IN ('1','2','3') --from table CTAS 
) 
ORDER BY ACC.NBR; 

Как примечание стороны, я хотел бы, если бы это было возможно, чтобы включить («1», «2», «3») в подзапрос, но похоже, что это не возможно, от других сообщение, которое я прочитал. Если бы это было легко, то это было бы (выберите отдельное имя z из CTAS)

+0

ты не должен квалифицироваться, где VALUEZ происходит от вашей PIVOT? – kevinsky

+0

@kevinsky Я попробовал поставить CTAS.VALUEZ или CTA.VALUEZ, но в случаях, связанных с ошибкой, он получил ошибку «Разрешены только простые имена столбцов» –

ответ

1

Столбцы, на которые делается ссылка в вашем предложении PIVOT, должны существовать в источнике строки, который поворачивается. Вы выбираете ACC.NBR,CTA.NAMEZ со стола; похоже, вам нужно увеличить это до ACC.NBR,CTA.NAMEZ,CTA.VALUEZ.

Вы не можете использовать подзапрос, чтобы заменить список значений поворота. Я полагаю, что основной причиной этого является то, что анализатор должен иметь возможность вычислять столбцы, которые запрос будет производить до его выполнения; поэтому значения поворота должны быть жестко закодированы.

Что бы вы могли сделать, если это целесообразно, чтобы обернуть этот запрос в процедуру или функцию, это сначала выполнить запрос, чтобы получить список значений поворота, а затем построить строку сводного запроса, используя эту информацию и выполнить его с помощью динамического SQL.

+0

Это было правильно, спасибо за помощь. –

0

ор-01748: только простые имена столбцов может здесь поворот

select* from (SELECT TRUNC(I.POST_DATE) DATES FROM INVOICE I 
INNER JOIN INVC_TENDER_V T ON T.INVC_SID=I.INVC_SID) 

PIVOT 
(COUNT(*) 
FOR T.TENDER_TYPE IN(0,1))