【问题标题】:The correct form of - listagg with case statement带case语句的listagg的正确形式
【发布时间】:2019-06-11 10:28:13
【问题描述】:

我收到错误:ORA-00907: missing right parenthesis,但我找不到错误的东西。

(select listagg(sp.name
||' : '||
(case when count(distinct sp.name) < 1 then NULL else szf.piece END) as cou_1, ',') 
WITHIN GROUP (ORDER BY sp.name,cou_1)
from sk_positions sp, sk_stock_f SZF, sk_stock SZ 
where SZF.CODE_ID =SK.ID AND SP.RID = SZF.RID_U AND SZF.ID_SZ = SZ.ID
and sp.sk_u = (%sk%) and SZF.piece != 0)

我想,listagg - case 有问题。

【问题讨论】:

  • 计算 ('s 和 )'s。同一个号码?
  • 今日提示:切换到现代、明确的JOIN 语法。更容易编写(没有错误),更容易阅读(和维护),并且在需要时更容易转换为外连接。
  • 什么是sk,没有别名为sk 的表。
  • @BarbarosÖzhan 这是我所在的当前表(项目 SK).. 这是 entrp 中的内部查询。程序(类似于 SAP...)

标签: sql oracle oracle11g case listagg


【解决方案1】:

这在 Oracle 中是不允许的。您缺少用于通配符搜索条件的单引号。

sp.sk_u = (%sk%)

正确的语法如下(仅LIKE 可用于此类条件搜索而不是=

sp.sk_u LIKE ('%sk%')

完整的查询应该如下所示

(select listagg(sp.name ||' : '||(case when count(distinct sp.name) < 1 
                                       then NULL 
                                       else szf.piece 
                                       END) as cou_1, ',') 
WITHIN GROUP (ORDER BY sp.name,cou_1)
from sk_positions sp, sk_stock_f SZF, sk_stock SZ 
where SZF.CODE_ID =SK.ID
      AND SP.RID = SZF.RID_U 
      AND SZF.ID_SZ = SZ.ID
      and sp.sk_u LIKE ('%sk%') 
      and SZF.piece != 0)

【讨论】:

  • 抱歉,如果你从where 子句(sp.sk_u = (%sk%))中删除它,你会得到同样的错误。
  • 我在答案编辑中添加了完整的解决方案。再检查一遍
  • 如果你不相信我请检查一下compiled
  • 分享需要生成的期望输出
【解决方案2】:

错误在这里:

szf.piece END) as cou_1
               ^

您不能给子表达式取别名,只能给列的完整表达式取别名。在Listagg 中,它应该在within group () 完成之后出现。

类似的东西

WITHIN GROUP (ORDER BY sp.name,cou_1) as cou_1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-28
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 2021-10-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多