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; 

Другие вопросы по тегам