数据透视表中的标识符无效

时间:2018-12-03 04:40:58

标签: sql oracle pivot-table

这是我的查询:

SELECT NVL(REVENUE,0), OUTNO, MONTH_NAME FROM 
        (                                                            
         SELECT ROUND((RETURNDATE-STARTDATE)*DAILYRATE) AS REVENUE, 
                OUTNO, 
                EXTRACT(MONTH FROM RETURNDATE)AS MONTH_NAME
         FROM   RAGREEMENT LEFT JOIN VEHICLE ON 
                RAGREEMENT.LICENSENO=VEHICLE.LICENSENO
                AND EXTRACT(YEAR FROM RETURNDATE)=EXTRACT(YEAR FROM SYSDATE)-1
        )
PIVOT (
   SUM(REVENUE)
   FOR OUTNO IN (1,2,3,4,5,6,-1 AS TOTAL)
  )
ORDER BY MONTH_NAME;

这是错误

SELECT NVL(REVENUE,0), OUTNO, MONTH_NAME FROM
                   *
ERROR at line 1:
ORA-00904: "OUTNO": invalid identifier

我无法理解为什么SELECT *完美运行时会发生这种情况

1 个答案:

答案 0 :(得分:0)

从一个透视图中得出的是一组全新的列名,对于这些新列中的每一个,您将需要一个NVL()COALESCE()。这是因为形成了一个全新的“矩阵”,并且其中的许多位置都可以为空。您无法通过在内部子查询中使用NVL()来克服这一问题。

假设您希望将月份作为列,则查询可能看起来像这样:

SELECT
   OUTNO
 , NVL('M1', 0)
 , NVL('M2', 0)
 , NVL('M3', 0)
 , NVL('M4', 0)
 , NVL('M5', 0)
 , NVL('M6', 0)
 , NVL('M7', 0)
 , NVL('M8', 0)
 , NVL('M9', 0)
 , NVL('M10', 0)
 , NVL('M11', 0)
 , NVL('M12', 0)
FROM (
     SELECT
            ROUND((RETURNDATE - STARTDATE) * DAILYRATE) AS REVENUE
          , OUTNO
          , 'M' || EXTRACT(MONTH FROM RETURNDATE) AS MONTH_NAME
     FROM RAGREEMENT
     LEFT JOIN VEHICLE ON RAGREEMENT.LICENSENO = VEHICLE.LICENSENO
         AND EXTRACT(YEAR FROM RETURNDATE) = EXTRACT(YEAR FROM SYSDATE) - 1
     )
PIVOT(
      SUM(REVENUE)
      FOR MONTH_NAME IN ('M1','M2','M3','M4','M5','M6','M7','M8','M9','M10','M11','M12')
     )
ORDER BY OUTNO;

此行产生新列:

      FOR MONTH_NAME IN ('M1','M2','M3','M4','M5','M6','M7','M8','M9','M10','M11','M12')

这是您需要在select子句中为空值“修复”的每一项。

要将OUTNO值放入列中,需要类似的模式,但是您需要知道与该原始列不同的值集。这个力量可能是1,2,3,4,5,6,-1,但我不确定。

nb:我在列标题中加了“ M”作为前缀,因为与标题名称一样多的系统都反对数字。