我有一个 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中,查询正在工作。
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;