【问题标题】:Aggregate function calls cannot be nested on PostgreSQL聚合函数调用不能嵌套在 PostgreSQL 上
【发布时间】:2020-06-29 13:30:34
【问题描述】:

我有一张桌子:

name  | doc  | filter
NAME1 | DOC1 | A1
NAME1 | DOC1 | B1
NAME1 | DOC1 | C1
NAME2 | DOC2 | A1
NAME2 | DOC2 | D1
NAME2 | DOC2 | C1
NAME3 | DOC3 | B1
NAME3 | DOC3 | A1

所以我创建了一个SELECT 命令:

SELECT name, doc, array_agg(filter) filter from table group by name, doc,这个返回:

name  | doc  | filter
NAME1 | DOC1 | {A1,B1,C1}
NAME2 | DOC2 | {A1,D1,C1}
NAME3 | DOC3 | {B1,A1}

我正在尝试使用以下代码在先前的表中创建SELECT 命令:

sum(case when array_agg(filter)::char like '%C1%' then 1 else 0 end) as "TOTAL"

但我收到错误:

聚合函数调用不能嵌套

如何解决?如果我想再添加一个这样的过滤器:

sum(case 
    when array_agg(filter)::char like '%C1%' or array_agg(filter)::char like '%C2%' 
    then 1 else 0 
end) as "TOTAL"`

怎么办?

【问题讨论】:

  • array_agg(filter)::char like '%C1%' 对我来说没有任何意义(如果你想转换一个数组,你应该把它转换成::text)。你想在那里做什么?计算filter 列中C1 的值的数量?请edit您的问题(通过单击其下方的edit 链接)并添加一些示例数据和基于该数据的预期输出为formatted text。请参阅here,了解有关如何创建漂亮的文本表的一些提示。
  • 您是否正在寻找count(*) filter (where "filter" = 'C1')
  • @a_horse_with_no_name filter 是我需要找到的许多值的数组
  • @a_horse_with_no_name 过滤器是其他表创建的字段
  • @a_horse_with_no_name 我更新我的帖子。

标签: sql arrays postgresql group-by count


【解决方案1】:

我怀疑你只是想要一个条件计数:

count(*) filter(where "filter" = 'C1') as total

这会为您提供组中filter 的值为'C1' 的行数。

如果你想考虑更多的过滤器值,那么:

count(*) filter(where "filter" in ('C1', 'C2')) as total

请注意,filter 是 Postgres 中的保留字,因此不是列名的好选择。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-29
    • 1970-01-01
    相关资源
    最近更新 更多