【问题标题】:Grouping by value with separation of the output按值分组并分离输出
【发布时间】:2020-04-27 07:52:47
【问题描述】:

我有一个这样的数据:

| 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 分组更好?

【问题讨论】:

  • 使用case表达式进行条件聚合

标签: java sql postgresql jpa


【解决方案1】:

使用过滤聚合:

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

【讨论】:

  • @Forin。 . .这是在 Postgres 中编写此代码的最佳方式。如果您不想过滤 :userId,您可以将其删除,但这是您的问题的一部分。
【解决方案2】:

在@jarlh 的提示下,我设法解决了我的问题:

SELECT eu.company_id,
   SUM(CASE WHEN eu.role_id = 2 THEN 1 ELSE 0 END) AS "first_role",
   SUM(CASE WHEN eu.role_id = 3 THEN 1 ELSE 0 END) AS "second_role"
FROM users eu
GROUP BY eu.company_id;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-18
    • 2018-11-29
    • 2021-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-09
    • 2019-06-28
    相关资源
    最近更新 更多