SqlExceptionHelper: ОШИБКА: счетчик функций (различающийся символ, целое число) не существует
У меня есть приложение Spring, и у меня есть собственный запрос с этим синтаксисом:
select
COUNT(DISTINCT person.id,(CASE WHEN salary_person.rating = 'Satisfactory' THEN 1 END)) AS totalSatisfactory,
COUNT(DISTINCT person.id,(CASE WHEN salary_person.rating = 'Unsatisfactory' THEN 1 END)) AS totalUnsatisfactory
from person
join salary_person on person.id = salary_person.person_id;
Я получаю ошибку:
ERROR: function count(character varying, integer) does not exist
В качестве базы данных я использую PostgreSQL. Я упоминаю, что в MySQL запрос работает.
2 ответа
Postgres не поддерживает count()
с более чем одним столбцом. Однако вы можете просто превратить оба столбца в один столбец с анонимным типом записи, используя что-то вроде: (col_one, col_two)
- это один столбец анонимного типа записи.
select COUNT(DISTINCT (person.id,(CASE WHEN salary_person.rating = 'Satisfactory' THEN 1 END))) AS totalSatisfactory,
COUNT(DISTINCT (person.id,(CASE WHEN salary_person.rating = 'Unsatisfactory' THEN 1 END))) AS totalUnsatisfactory
from person
join salary_person on person.id = salary_person.person_id;
Обратите внимание на круглые скобки вокруг двух столбцов.
Тем не менее, в Postgres у вас есть более элегантный способ делать то, что вы хотите, используя условное агрегирование с filter
пункт:
select COUNT(DISTINCT person.id) filter (where salary_person.rating = 'Satisfactory') AS totalSatisfactory,
COUNT(DISTINCT person.id) filter (where salary_person.rating = 'Unsatisfactory') AS totalUnsatisfactory
from person
join salary_person on person.id = salary_person.person_id;
Быстрая и грязная альтернатива подсчету отдельных столбцов независимо от типа состоит в том, чтобы просто объединить два столбца в один столбец и подсчитать отдельные, которые
SELECT
COUNT(DISTINCT CONCAT(person.id, salary_person.rating))
FROM person
JOIN salary_person on person.id = salary_person.person_id;
Однако, исходя из того, что вы хотите сделать, не можете ли вы просто считать отдельные по рейтингу и фильтровать по определенным рейтингам?
SELECT
salary_person.rating,
COUNT(DISTINCT person.id)
FROM person
JOIN salary_person on person.id = salary_person.person_id
WHERE
salary_person.rating in ('Satisfactory', 'Unsatisfactory')
GROUP BY 1;