【问题标题】:LISTAGG Query "ORA-00937: not a single-group group function" [duplicate]LISTAGG 查询“ORA-00937:不是单组组功能”[重复]
【发布时间】:2014-08-06 20:14:04
【问题描述】:

我正在尝试使用逗号分隔值列表创建连接。例如:

rule_id | attribute_id
----------------------
1       | a
1       | b
2       | c
2       | d

应该是:

rule_id | attribute_id
----------------------
1       | a,b
2       | c,d

我正在尝试使用LISTAGG 这样做。但是,使用下面的代码,我得到了ORA-00937: not a single-group group function。我注意到 sql-server 的 FOR PATH 语法,但它看起来不适用于我们的配置。这是我的查询:

SELECT r.rule_id as RULE_ID, 
LISTAGG(a.ATTRIBUTE_ID, ', ') WITHIN GROUP (ORDER BY a.ATTRIBUTE_ID) "ATTR_IDS"
FROM N_RULE r, N_ATTRIBUTE a 
WHERE r.RULE_ID = a.RULE_ID 
ORDER BY r.AUDIENCE, UPPER(r.NAME);

【问题讨论】:

  • 添加GROUP BY R.RULE_ID。为什么您要按未出现在所选列中的内容进行排序?
  • @ben 这不是一个重复的问题,因为它在使用listagg 时询问错误。问题与使用该函数的partition子句有关
  • OP 正在尝试通过“规则”@aturegano 聚合“属性”。尽管该函数可以采用窗口子句,但这不是 OP 根据其样本数据和所需结果使用它的方式。他们也接受了同样的回答。
  • @ben 你是对的。很抱歉打扰您了。

标签: sql oracle


【解决方案1】:

我认为要使您的查询起作用,您需要添加group by,更改order by。您还应该使用正确的显式连接语法:

SELECT r.rule_id as RULE_ID, 
       LISTAGG(a.ATTRIBUTE_ID, ', ') WITHIN GROUP (ORDER BY a.ATTRIBUTE_ID) as "ATTR_IDS"
FROM N_RULE r JOIN
     N_ATTRIBUTE a 
     ON r.RULE_ID = a.RULE_ID 
GROUP BY r.rule_id
ORDER BY r.rule_id;

或者,您可能想在结果中包含其他属性:

SELECT r.rule_id, r.AUDIENCE, UPPER(r.NAME) 
       LISTAGG(a.ATTRIBUTE_ID, ', ') WITHIN GROUP (ORDER BY a.ATTRIBUTE_ID) as "ATTR_IDS"
FROM N_RULE r JOIN
     N_ATTRIBUTE a 
     ON r.RULE_ID = a.RULE_ID 
GROUP BY r.rule_id, r.AUDIENCE, UPPER(r.NAME)
ORDER BY r.AUDIENCE, UPPER(r.NAME);

【讨论】:

  • 所以看起来在某些行中,逗号分隔的值是相同的(即“54,54”)有什么想法吗?
  • 这意味着join 正在返回重复项。这个答案可能会给你一些关于如何解决它的想法:stackoverflow.com/questions/11510870/…
猜你喜欢
  • 2021-11-30
  • 1970-01-01
  • 2012-04-16
  • 1970-01-01
  • 2011-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多