【问题标题】:How can I bypass this issue? SQL Error ORA-00904我怎样才能绕过这个问题? SQL 错误 ORA-00904
【发布时间】:2017-11-13 11:12:10
【问题描述】:

这段代码我遇到了麻烦:

SELECT 
s.codcli,
s.consfin consistenza_iniziale, 
s.periodo,
ss.consfin consistenza_finale,
ss.periodo,
(SELECT sum(quanti) somma_bonifici_ingresso 
FROM mov WHERE tipope IN ('VE1', 'VE5', 'VE9') AND (datope BETWEEN to_date('01-01-2016', 'DD-MM-YYYY') AND to_date('30-07-2017', 'DD-MM-YYYY')) AND mov.codcli = s.codcli 
GROUP BY codcli, tipope) as somma_bonifici_ingresso,
(SELECT sum(quanti) somma_bonifici_ingresso 
FROM mov WHERE tipope IN ('PR1', 'PR5', 'PR9') AND (datope BETWEEN to_date('01-01-2016', 'DD-MM-YYYY') AND to_date('30-07-2017', 'DD-MM-YYYY')) AND mov.codcli = s.codcli 
GROUP BY codcli, tipope) as somma_bonifici_uscita,
(ss.consfin - (somma_bonifici_ingresso - somma_bonifici_uscita) - s.consfin)/s.consfin as variazione 
FROM  sre s
LEFT JOIN sre ss on s.codcli = ss.codcli
WHERE s.periodo=to_date('01-01-2016', 'DD-MM-YYYY') 
AND ss.periodo=to_date('30-06-2017', 'DD-MM-YYYY') 
AND s.consfin>0 
ORDER BY s.codcli

我收到 00904 错误,不是有效的标识符。我需要插入一个新列来排列 somma_bonifici_ingresso 和 somma_bonifici_uscita 列。我必须进行一些计算,但它似乎无法找到我猜想的别名列...

【问题讨论】:

  • 没有定义你要查询的表,也是我们在猜测。
  • 您还应该指定确切的错误以及它可能给您它所指的行/列号。我认为这里没有足够的信息可以使用。

标签: sql oracle alias calculated-columns


【解决方案1】:

您不能在同一 select 中重复使用列别名,因此请使用子查询:

SELECT s.*,
       (consistenza_iniziale - (somma_bonifici_ingresso - somma_bonifici_uscita) - consistenza_iniziale) / consistenza_iniziale as variazione 
FROM (SELECT s.codcli, s.consfin as consistenza_iniziale, s.periodo,
             ss.consfin as consistenza_finale, ss.periodo,
             (SELECT sum(quanti) 
              FROM mov
              WHERE tipope IN ('VE1', 'VE5', 'VE9') AND
                    (datope BETWEEN DATE '2016-01-01' AND DATE '2017-07-30') AND
                    mov.codcli = s.codcli 
             ) as somma_bonifici_ingresso,
             (SELECT sum(quanti) 
              FROM mov
              WHERE tipope IN ('PR1', 'PR5', 'PR9') AND
                    (datope BETWEEN '2016-01-01' AND DATE '2017-07-30') AND
                    mov.codcli = s.codcli 
             ) as somma_bonifici_uscita,
      FROM sre s LEFT JOIN
           sre ss 
           ON s.codcli = ss.codcli
      WHERE s.periodo = DATE '2016-01-01' AND
            ss.periodo = DATE '2017-07-30' AND
            s.consfin > 0
     ) s
ORDER BY codcli;

其他说明:

  • 使用日期常量而不是文字。 DATE 日期和TIMESTAMPS 如果有时间。
  • 检查您的日期。子查询中的日期与外部WHERE 中的日期存在差异。
  • GROUP BY 在子查询中是不必要的——而且很糟糕。您最终可能会遇到“返回的行数过多”错误。

【讨论】:

  • 除了 Gordon 的 cmets,我想知道您是否真的需要将 ss.periodo = DATE '2017-07-30' 谓词从 where 子句移到 left join 子句。取决于你想要的输出,我猜!
  • 嗨,我现在收到此错误代码:ORA-00936 缺少表达式
猜你喜欢
  • 1970-01-01
  • 2012-03-16
  • 1970-01-01
  • 2019-12-01
  • 2013-10-24
  • 1970-01-01
  • 2022-11-11
  • 1970-01-01
  • 2022-10-18
相关资源
最近更新 更多