ORA-00904:“CTN_QUANTITY”: - “%s:无效标识符”

时间:2016-12-09 14:51:40

标签: sql oracle count alias

我尝试选择CTN_QUANTITY不为空的行。我的查询

select distinct SDB.CTN_MAIN as S_CTN_MAIN, 
    SDB.SUBS_KEY as S_SUBS_KEY, 
    SDB.BAN_KEY as S_BAN_KEY, 
    count(SDB.CTN_MAIN) as CTN_QUANTITY,
    FPCN.BAN_KEY as BAN_KEY
from STG_SDB_LOAD SDB, FCT_PREP_CHARGES_N FPCN
    where FPCN.business_service_key = 33006
    and CTN_QUANTITY <> ''
group by SDB.CTN_MAIN, 
    SDB.SUBS_KEY, 
    SDB.BAN_KEY, 
    FPCN.BAN_KEY;

我收到错误

ORA-00904. -  "%s: invalid identifier"

我需要改变什么?

2 个答案:

答案 0 :(得分:3)

CTN_QUANTITY被定义为SELECT子句中表达式的别名。但是你想在WHERE子句中使用它。这不起作用 - 在WHERE之前处理SELECT。您必须在count(SDB.CTN_MAIN)子句中使用WHERE,而不是别名。

然后:计数始终是一个数字,但您将它与空字符串进行比较。在Oracle中NULL,但无论如何,它都没有意义。而且,COUNT可能为零,永远不应为NULL

您可能需要撰写WHERE count(....) <> 0

编辑:当然,正如下面的评论中讨论的那样...... COUNT过滤器不属于WHERE子句,它应该在HAVING子句中。

答案 1 :(得分:-1)

您必须使用IS NOT NULL代替&lt;&gt; 。此外,您不能在and子句中使用别名。

 select a.* from 
  (SELECT DISTINCT SDB.CTN_MAIN AS S_CTN_MAIN,
                  SDB.SUBS_KEY AS S_SUBS_KEY,
                  SDB.BAN_KEY AS S_BAN_KEY,
                  COUNT (SDB.CTN_MAIN) AS CTN_QUANTITY,
                  FPCN.BAN_KEY AS BAN_KEY
    FROM STG_SDB_LOAD SDB, FCT_PREP_CHARGES_N FPCN
   WHERE FPCN.business_service_key = 33006   
GROUP BY SDB.CTN_MAIN,
         SDB.SUBS_KEY,
         SDB.BAN_KEY,
         FPCN.BAN_KEY ) a
 WHERE a.CTN_QUANTITY IS NOT NULL  

要分析的事情:拥有这样的条件a.CTN_QUANTITY IS NOT NULL真的很有用。也许您可以通过研究并考虑@mathguy建议来了解更多信息。