2011-02-23 11 views
5

Tengo dos consultas donde solo necesito el recuento de registros totales, pero la única diferencia en las consultas es un valor de campo.Combinar dos consultas SELECT en una

Ejemplo;

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

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

¿Cómo puedo obtener algo como esto: (pseudo)

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

Pero los resultados son así

group_a , group_b 
56, 101 

estaba pensando una declaración CASE en la consulta para filtrar el dos, pero ¿cómo lo implemento? ¿O hay un mejor camino?

estoy haciendo un UNION en este momento pero quería saber si podía volver un disco con dos resultados

Respuesta

6
select sum(case when category = 'value_a' then 1 else 0 end) as group_a, 
     sum(case when category = 'value_b' then 1 else 0 end) as group_b 
    from tbl 
    where category in ('value_a', 'value_b') 
+3

Tenga en cuenta que la cláusula where solo ayuda si la columna "categoría" está indexada –

+0

@Phillip: Usted es, por supuesto, correcto. –

+0

¿Le importaría al infractor explicar su objeción? –

2
select sum(case when category = 'value_a' then 1 else 0 end) group_a, 
     sum(case when category = 'value_b' then 1 else 0 end) group_b 
from tbl 
2
SELECT category,COUNT(*) FROM tbl 
GROUP BY category; 

que se expande a más categorías. Si desea que sólo esas categorías

SELECT category,COUNT(*) FROM tbl 
WHERE category IN ('value_a', 'value_b') 
GROUP BY category; 
+1

Debería agregar una categoría WHERE IN ('value_a', 'value_b') a ella. –

+0

Maldito seas Internets, eres rápido. – corrodedmonkee

+0

Esta respuesta no es correcta. La tarea era ajustar los grupos en una sola fila. – TToni

1

Sólo por el gusto de hacerlo:

SELECT * 
FROM 
(
    SELECT category 
    FROM tbl 
) subquery 
PIVOT 
(
    COUNT(category) 
    FOR category IN ([value_a],[value_b]) 
) AS piv 
+0

Lo siento, no noté PostgreSQL. Pero si usaba MS SQL 2005+, el pivote es una característica interesante. – SQLMason

+0

PostgreSQL también tiene el pivote, es un módulo contrib: http://www.postgresql.org/docs/current/interactive/tablefunc.html –

2

qué extraña respuestas para el recuento. He aquí una sencilla RECUENTO:

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

El agregado COUNT en PostgreSQL permite compleja sintaxis como he mostrado. Tenga en cuenta que el OR NULL es bastante esencial ya que COUNT cuenta solo aquellas filas para las cuales la condición category = '...' OR NULL da una respuesta no NULA.

+0

+1 para la extraña sintaxis de PostgreSQL :) – rsenna