Объединить два запроса SELECT в один

У меня есть два запроса, в которых мне нужно только общее количество записей, но единственная разница в запросах - это одно значение поля.

Пример;

SELECT COUNT(*) AS group_a
FROM tbl
WHERE category = 'value_a'

SELECT COUNT(*) AS group_b
FROM tbl
WHERE category = 'value_b'

Как я могу получить что-то вроде этого: (псевдо)

SELECT COUNT(*) AS group_a, COUNT(*) AS group_b
FROM tbl
WHERE category IN ('value_a', 'value_b')

Но результаты такие

group_a , group_b
56, 101

Я думал, что оператор CASE в запросе отфильтрует два, но как мне его реализовать? или есть лучший способ?

Я делаю UNION прямо сейчас, но хотел знать, могу ли я вернуть одну запись с двумя результатами


person Phill Pafford    schedule 23.02.2011    source источник


Ответы (4)


SELECT category,COUNT(*) FROM tbl
GROUP BY category;

Это расширяется до большего количества категорий. Если вам нужны только эти категории

SELECT category,COUNT(*) FROM tbl
WHERE category IN ('value_a', 'value_b')
GROUP BY category; 
person corrodedmonkee    schedule 23.02.2011
comment
Вы должны добавить к нему категорию WHERE IN ('value_a', 'value_b'). - person a_horse_with_no_name; 23.02.2011
comment
Будь ты проклят, интернеты, ты быстрый. - person corrodedmonkee; 23.02.2011
comment
Этот ответ неверен. Задача состояла в том, чтобы уместить группы в один ряд. - person TToni; 23.02.2011
comment
Мне нравится простой GROUP BY, поэтому +1, но нужно вернуть в одну строку - person Phill Pafford; 23.02.2011
comment
Вернуть весь набор результатов, а не строку за строкой, верно? Он делает то же самое! - person corrodedmonkee; 23.02.2011

Какие странные ответы для подсчета. Вот простой СЧЕТ:

SELECT COUNT(category = 'value_a' OR NULL) AS group_a, COUNT(category = 'value_b' OR NULL) AS group_b FROM tbl;

Агрегат COUNT в PostgreSQL допускает сложный синтаксис, как я показал. Обратите внимание, что OR NULL очень важен, так как COUNT подсчитывает только те строки, для которых условие category = '...' OR NULL дает ответ, отличный от NULL.

person jmz    schedule 23.02.2011

Просто для удовольствия:

SELECT * 
FROM 
(
    SELECT category
    FROM tbl 
) subquery
PIVOT
(
    COUNT(category)
    FOR category IN ([value_a],[value_b])
) AS piv
person SQLMason    schedule 23.02.2011
comment
Извините, я не заметил PostgreSQL. Но если вы использовали MS SQL 2005+, поворот — это классная функция. - person SQLMason; 23.02.2011
comment
PostgreSQL также имеет сводную точку, это вспомогательный модуль: postgresql.org/docs/ текущий/интерактивный/tablefunc.html - person Frank Heikens; 23.02.2011

person    schedule
comment
Обратите внимание, что предложение where поможет только в том случае, если категория столбца индексируется. - person Philip Kelley; 23.02.2011
comment
+1, чтобы компенсировать понижение. Понижение без объяснения причин не очень вежливо. Может ты и прав, приведи аргументы. - person Frank Heikens; 23.02.2011
comment
@Frank: Спасибо, и я согласен. Я не возражаю против отрицательных голосов, когда я не прав (и я могу ошибаться, как и все), но я не люблю анонимные отрицательные голоса. - person Joe Stefanelli; 23.02.2011