Oracle Pivot Multi Table

时间:2015-06-22 18:56:36

标签: sql oracle oracle11g pivot

我正在尝试在Oracle中创建一个Pivot。我一直收到错误消息

  

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')转换为子查询,我会很高兴。 ,但看起来这是不可能从我读过的其他帖子。如果它很容易(从CTAS中选择​​不同的名称)

2 个答案:

答案 0 :(得分:1)

PIVOT子句中引用的列必须存在于正在旋转的行源中。您从表中选择ACC.NBR,CTA.NAMEZ,CTA.VALUEZ;您似乎需要将其扩展为 animal animal A Dog Dog B Cat Cat C Pig Pig D Cat Dog

您不能使用子查询来替换透视值列表。我认为其根本原因是解析器必须能够在执行之前找出查询将生成的列;所以枢轴值必须是硬编码的。

如果适合在过程或函数中包装此查询,您可以做的是首先执行查询以获取透视值列表,然后使用该信息构建透视查询字符串,通过动态SQL执行它。

答案 1 :(得分:0)

  

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