首页 > 解决方案 > 按值分组并分离输出

问题描述

我有这种类型的数据:

| company_id | role_id |  
| 1          | 1       |
| 2          | 2       |
| 1          | 2       |

这是我的查询,它选择一个公司 ID 并作为参数角色 ID 传递。

SELECT company_id AS companyId, COUNT(role_id) AS usersNumber 
FROM companies
WHERE role_id = :userId
GROUP BY companyId

:userId从 JPA 传递的参数在哪里。

这会产生这样的东西:

| company_id | passed_role_id_count |
| 1          | 1                    |
| 2          | 1                    |

我想要实现的是有这样的输出:

| company_id | first_role_count | second_role_count |
| 1          | 1                | 1                 |
| 2          | 0                | 1                 |

有可能有这样的输出吗?还是从 DB 中选择所有然后使用 Java Streams 分组更好?

标签: javasqlpostgresqljpa

解决方案


使用过滤聚合:

SELECT company_id AS companyId, 
       COUNT(*) filter (where role_id = 1) AS first_role_count, 
       COUNT(*) filter (where role_id = 2) AS second_role_count
FROM companies
WHERE role_id = :userId
GROUP BY companyId

推荐阅读