Как генерировать синтетические группы с нулевым счетом

Представьте, у меня есть эти данные:

id   |   category
1    |   cat_1
2    |   cat_3
3    |   cat_3
4    |   cat_1

Обратите внимание, что значения cat_2 отсутствуют, но я знаю, что cat_2 является возможным значением, и я хочу, чтобы отчеты отражали это.

Если я пишу простой запрос для элементов COUNT и категории GROUP BY , я получаю:

category   |   count(item)
cat_1      |   2
cat_3      |   2

Когда вместо этого я хочу:

category   |   count(item)
cat_1      |   2
cat_2      |   0
cat_3      |   2

Используя ванильный ANSI SQL, без определенного диалекта ... какой самый эффективный способ получить результат, который я получу? Я могу придумать несколько особенно хакерских подходов, но должен быть более чистый путь.

Всего 1 ответ


В идеале у вас должна быть специальная таблица category , которая отслеживает все категории, которые существуют и должны появляться в выводе вашего запроса. В случае неудачи вы можете попробовать встроить подзапрос, содержащий все категории, которые вы хотите отобразить:

SELECT
    c.category,
    COUNT(t.id) AS cnt
FROM
(
    SELECT 'cat_1' AS category UNION ALL
    SELECT 'cat_2' UNION ALL
    SELECT 'cat_3'
) c
LEFT JOIN yourTable t
    ON c.category = t.category
GROUP BY
    c.category;

Есть идеи?

10000