Группировка по значению с разделением выхода - PullRequest
0 голосов
/ 27 апреля 2020

У меня есть данные этого типа:

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

Вот мой запрос, который выбирает один идентификатор компании и передается в качестве идентификатора роли аргумента.

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                 |

Возможно ли иметь такой вывод? Или, может быть, лучше выбрать все из БД и затем группировать, используя Java Streams?

Ответы [ 2 ]

3 голосов
/ 27 апреля 2020

Использовать отфильтрованное объединение:

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
1 голос
/ 27 апреля 2020

С подсказкой @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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...