Oracle:ORA-00936:缺少表达式,试图将 where 语句添加到所选列

Oracle: ORA-00936: missing expression, trying to add where statement to selected column

我有一个 SQL 查询,它可以很好地从我们的数据库中获取过去 2 年的信息 当我尝试添加一个向 [= 添加新条件的语句时,问题出现了28=].

where ASSIGNED_REP = 'PERSON, SOME',

也许我做错了,但我从中提取的其中一列是这样设置的:

name_full AS ASSIGNED_REP,

所以我想如果我添加了 where 语句,它应该只会 return 结果在该列包含我给它的用户名的地方。但是我收到错误 Oracle: ORA-00936: missing expression.

我的 SQL 完美运行,直到我在第 4 行添加 where ASSIGNED_REP = 'PERSON, SOME'

我是 SQL 的新手,所以我确定我遗漏了一些东西。

完整 SQL:

select 
ccc.BID AS B_ID,
TTTT,
name_full AS ASSIGNED_REP where ASSIGNED_REP = 'PERSON, SOME', /* issue is here */
bbb.CUID,
bbb.BNN,
bbb.PGN,
ccc.TYP_CD AS CLM_TYP,
ccc.C_TYP AS SCLM_TYP,
C_DATE,
NEXT_DATE,
SUM(ccc.LINE) AS line_items,
SUM(ccc.AMT) AS c_amount,
SUM(ccc.CO_RSLVD) AS Z_RSLVD,
SUM(ccc.CU_RSLVD) AS C_RSVLD,
ccc.STATUS_TYP AS STATUS,
DATE_FOLLOW_UP,
bbb.STATE
from bstatus bbb
join display_view ccc on ccc.bnn = bbb.bn
left join user_profile up on uuu.zz_id = ccc.ASSIGNED_USER_ID
where ccc.C_DATE >= (sysdate - 730)
/* Also tried */
/* and ASSIGNED_REP = 'PERSON, SOME' */
group by ccc.BID,
TTTT,
uuu.name_full,
bbb.CUID,
bbb.BAN,
bbb.PGN,
ccc.TYP_CD,
ccc.C_TYP,
C_DATE,
NEXT_DATE,
ccc.STATUS_TYP,
DATE_FOLLOW_UP,
bbb.STATE

你走在正确的轨道上。你想在这里做的是添加到你现有的 WHERE 子句

SELECT ccc.BID AS B_ID
    ,TTTT
    ,ASSIGNED_REP
    ,bbb.CUID
    ,bbb.BNN
    ,bbb.PGN
    ,ccc.TYP_CD AS CLM_TYP
    ,ccc.C_TYP AS SCLM_TYP
    ,C_DATE
    ,NEXT_DATE
    ,SUM(ccc.LINE) AS line_items
    ,SUM(ccc.AMT) AS c_amount
    ,SUM(ccc.CO_RSLVD) AS Z_RSLVD
    ,SUM(ccc.CU_RSLVD) AS C_RSVLD
    ,ccc.STATUS_TYP AS STATUS
    ,DATE_FOLLOW_UP
    ,bbb.STATE
FROM bstatus bbb
    JOIN display_view ccc ON ccc.bnn = bbb.bn
    LEFT JOIN user_profile up ON uuu.zz_id = ccc.ASSIGNED_USER_ID
WHERE ccc.C_DATE >= (sysdate - 730)
    AND name_full = 'PERSON, SOME'
GROUP BY ccc.BID
    ,TTTT
    ,uuu.name_full
    ,bbb.CUID
    ,bbb.BAN
    ,bbb.PGN
    ,ccc.TYP_CD
    ,ccc.C_TYP
    ,C_DATE
    ,NEXT_DATE
    ,ccc.STATUS_TYP
    ,DATE_FOLLOW_UP
    ,bbb.STATE

现在您将只能获得名为PERSON, SOME

的人最近两年的门票

查询的结构是 pretty well defined。您不能有超过一个 where 子句 1,并且它不属于 select 列表的中间。

您想添加另一个条件,因此将其添加到现有的 where 子句中:

select 
ccc.BID AS B_ID,
TTTT,
uuu.name_full AS ASSIGNED_REP,
...
where ccc.C_DATE >= (sysdate - 730)
and uuu.name_full = 'PERSON, SOME'
group by ccc.BID,
...

注意不能在where子句中使用ASSIGNED_REP别名,必须使用原来的列名。上面链接的文档还包括(强调):

c_alias

Specify an alias for the column expression. Oracle Database will use this alias in the column heading of the result set. The AS keyword is optional. The alias effectively renames the select list item for the duration of the query. The alias can be used in the order_by_clause but not other clauses in the query.

因此您可以 order by ASSIGNED_REP,但不能在 where 子句或其他任何地方使用它。


1 我忽略了子查询...