Совокупные вызовы функций не могут быть вложены в PostgreSQL - PullRequest
0 голосов
/ 18 марта 2020

У меня есть таблица:

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"`

Как это сделать?

1 Ответ

1 голос
/ 18 марта 2020

Я подозреваю, что вы просто хотите условный счет:

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

Это дает вам количество строк в группе, где filter имеет значение 'C1'.

Если вы Если вы хотите учесть больше значений фильтра, то:

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

Обратите внимание, что filter является зарезервированным словом в Postgres, поэтому не подходит для имени столбца.

...