Включить COUNT (включая 0) сгруппированных записей - PullRequest
1 голос
/ 02 мая 2020

У меня есть таблица, как показано ниже

answers:
| room | answer |
|------|--------|
| 001  | 3      |
| 002  | 6      |
| 002  | 5      |
| 002  | 6      |

Я хочу посчитать ответы для каждой комнаты. Это довольно просто, но я также хочу получить нулевые значения для каждой комнаты и каждого возможного ответа (отличного от всех ответов), как показано ниже

| room | answer | answerCount |
|------|--------|-------------|
| 001  | 3      | 1           |
| 001  | 5      | 0           |
| 001  | 6      | 0           |
| 002  | 3      | 0           |
| 002  | 5      | 1           |
| 002  | 6      | 2           |

Мне уже было трудно решить эту проблему, надеюсь, вы, ребята, можете Помоги мне? :)

Ответы [ 2 ]

1 голос
/ 02 мая 2020

Одним из вариантов будет использование самостоятельного объединения, когда одна сторона оператора соединения содержит четко выбранный набор для ответа с

SELECT a1.room,  a2.answer, SUM( a1.answer=a2.answer ) AS answerCount 
  FROM answers a1
  JOIN ( SELECT DISTINCT answer FROM answers ) a2
 GROUP BY a1.room, a2.answer

Демо

1 голос
/ 02 мая 2020

Вы можете перекрестно соединить производные таблицы, выбрав отдельные комнаты или ответ соответственно, а затем оставить присоединение к ним, агрегировать и получить счет.

SELECT x1.room,
       x2.answer,
       count(t3.room) answercount
       FROM (SELECT DISTINCT
                    t1.room
                    FROM elbat t1) x1
            CROSS JOIN (SELECT DISTINCT
                               t2.answer
                               FROM elbat t2) x2
            LEFT JOIN elbat t3
                      ON t3.room = x1.room
                         AND t3.answer = x2.answer
       GROUP BY x1.room,
                x2.answer
       ORDER BY x1.room,
                x2.answer;

В идеале, у вас должна быть таблица со всеми комнатами и еще один ответ со всеми ответами и перекрестное соединение вместо производных таблиц.

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