COUNT MAX CASE и GROUP BY для повторяющегося идентификатора типа - PullRequest
0 голосов
/ 02 февраля 2019

У меня есть это представление, полученное в результате множественного объединения:

project_id  | document_type_id
10          | 2
10          | 2
10          | 3
10          | 1
10          | 1
10          | 1
11          | 2
11          | 2
11          | 2
11          | 2
11          | 3
11          | 3

метка для 1: "обзор"

метка для 2: "интервью"

меткадля 3: "роман"

Я уже получил эту таблицу:

project_id  | review     | interview | romance
10          | OK         | OK        | OK
11          | NO         | OK        | OK

, используя следующую инструкцию запроса:

SELECT `project_id`, `document_type_id`,
MAX(CASE WHEN `document_type_id` = 1 THEN "OK" ELSE "NO" END) as "review",
MAX(CASE WHEN `document_type_id` = 2 THEN "OK" ELSE "NO" END) as "interview",
MAX(CASE WHEN `document_type_id` = 3 THEN "OK" ELSE "NO" END) as "romance"

FROM projectDocumentList
GROUP BY project_id

Теперь мне нужно подсчитать каждыйтип документа в каждом поле таблицы:

project_id  | review | interview | romance
10          | 3      | 2         | 1
11          | 0      | 4         | 2

Я пытался и пытался, но не могу найти правильный синтаксис для получения этого результата.Некоторые из моих предыдущих попыток ...

COUNT(MAX(CASE WHEN `document_type_id` = 1 THEN "1" ELSE "NO" END)) as "review"

MAX(CASE WHEN `document_type_id` = 1 THEN (SELECT COUNT(`document_type_id`)) ELSE "NO" END) as "review"

COUNT(DISTINCT(MAX(CASE WHEN `document_type_id` = 1 THEN `document_type_id` ELSE "NO" END)) as "review"

Есть идеи по этому поводу?Благодарю.V.

1 Ответ

0 голосов
/ 02 февраля 2019

Вы можете использовать SUM()

Запрос

SELECT `project_id`,
SUM(CASE WHEN `document_type_id` = 1 THEN 1 ELSE 0 END) as "review",
SUM(CASE WHEN `document_type_id` = 2 THEN 1 ELSE 0 END) as "interview",
SUM(CASE WHEN `document_type_id` = 3 THEN 1 ELSE 0 END) as "romance"
FROM projectDocumentList
GROUP BY project_id

Результаты

| project_id | review | interview | romance |
| ---------- | ------ | --------- | ------- |
| 10         | 3      | 2         | 1       |
| 11         | 0      | 4         | 2       |

демо

Или COUNT(..) также можно использовать, но вам нужно использовать NULL вместо 0.Это связано с тем, что COUNT(..) обрабатывает 0, 1 и значения NULL , отличные от SUM(..).

Запрос

SELECT `project_id`,
COUNT(CASE WHEN `document_type_id` = 1 THEN 1 ELSE NULL END) as "review",
COUNT(CASE WHEN `document_type_id` = 2 THEN 1 ELSE NULL END) as "interview",
COUNT(CASE WHEN `document_type_id` = 3 THEN 1 ELSE NULL END) as "romance"
FROM projectDocumentList
GROUP BY project_id

Результаты

| project_id | review | interview | romance |
| ---------- | ------ | --------- | ------- |
| 10         | 3      | 2         | 1       |
| 11         | 0      | 4         | 2       |

демо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...