2010-04-27 13 views
171

Tengo una consulta de selección sql que tiene un grupo por. Quiero contar todos los registros después del grupo por declaración. ¿Hay alguna manera de hacerlo directamente desde sql? Por ejemplo, tener una tabla con los usuarios deseo seleccionar los diferentes pueblos y el número total de de los usuariosCómo usar el recuento y el grupo en la misma instrucción de selección

select town, count(*) from user 
group by town 

Quiero tener una columna con todos los pueblos y otro con el número de usuarios en todo filas

Un ejemplo del resultado por tener 3 ciudades y 58 usuarios en total es:

Town   Count 
Copenhagen 58 
NewYork  58 
Athens  58 
+0

quieres decir que quieres que tu conjunto de resultados tenga 2 cuentas una para ciudades y otra para usuarios? – Leslie

+2

Entonces, ¿desea una fila para cada ciudad, y en cada fila, la columna 2 contiene el recuento total de todos los usuarios? ¿Entonces la columna 2 tiene el * mismo * valor para cada fila? Si edita para incluir datos de muestra y resultados requeridos, podremos darle exactamente lo que desea. – AakashM

+0

¡Tienes razón, AakashM! Solo lo edité. – Stavros

Respuesta

218

Esto va a hacer lo que quiere (lista de ciudades, con el número de usuarios en cada uno):

select town, count(town) 
from user 
group by town 

Puede usar más aggregate functions cuando usa GROUP BY.

actualización (tras el cambio de cuestionar y comentarios)

Se puede declarar una variable para el número de usuarios y configurarlo para que el número de usuarios a continuación, seleccione con eso.

DECLARE @numOfUsers INT 
SET @numOfUsers = SELECT COUNT(*) FROM user 

SELECT DISTINCT town, @numOfUsers 
FROM user 
+0

¿Eso es exactamente lo que escribió el OP? nvm, veo tu diferencia, estás contando Town not * .... – Leslie

+0

@Leslie - no hay diferencia entre las dos consultas. Ellos devolverán el mismo conjunto de resultados. Simplemente no me gusta el uso de '*' ... El OP contestó su propia pregunta, pero no pareció siquiera ponerla a prueba, solo estoy validando que sea correcta :) http://www.fredosaurus.com/notes- db/select/groupby.html – Oded

+6

COUNT (*) puede no ser igual a COUNT (ciudad). Usar * en COUNT es perfectamente válido ... – gbn

3

Con Oracle podría utilizar las funciones analíticas:

select town, count(town), sum(count(town)) over() total_count from user 
group by town 

Sus otras opciones es usar una subconsulta:

select town, count(town), (select count(town) from user) as total_count from user 
group by town 
+0

algo así como el último funcionaría, pero quería ver si hay alguna otra solución ... – Stavros

+0

¿Y no puede usar la primera opción (función analítica)? ¿Qué plataforma de base de datos estás usando? – Tommi

+0

@Stavros: El último es lento –

25

La otra forma es:

/* Number of rows in a derived table called d1. */ 
select count(*) from 
(
    /* Number of times each town appears in user. */ 
    select town, count(*) 
    from user 
    group by town 
) d1 
+5

necesita alias de lo contrario no funcionaría en mysql. seleccionar recuento (*) de() agr – amas

2

Si quieres ordenar por conteo (sonido simple pero yo `t encontrado una respuesta en la pila de cómo hacerlo) que puede hacer:

 SELECT town, count(town) as total FROM user 
     GROUP BY town ORDER BY total DESC 
119

Puede utilizar COUNT(DISTINCT ...):

SELECT COUNT(DISTINCT town) 
FROM user 
+3

funciona como un amuleto ... debe elegirse la respuesta principal ... salvo que algunos prueban que esto no es bueno. – Victor

+0

No funciona en combinación con una cláusula WHERE. –

+0

@PerLindberg, funciona bien para mí. Agregue DONDE después de FROM. – milkovsky

2

Puede utilizar DISTINCT dentro de la RECUENTO igual que lo milkovsky dijo

en mi caso:

select COUNT(distinct user_id) from answers_votes where answer_id in (694,695); 

Esto hará que el recuento de votos de respuesta considerada la misma u ser_id como un cargo

1

Si desea seleccionar la ciudad y recuento total de usuarios, puede utilizar esta consulta a continuación:

SELECT Town, (SELECT Count(*) FROM User) `Count` FROM user GROUP BY Town; 
0

Pruebe el siguiente código:

select ccode, count(empno) 
from company_details 
group by ccode; 
+0

puede explicar lo que está haciendo este código. Gracias – MZaragoza

+0

usamos este código para encontrar cuántos empleados totales para el día de hoy calcule en todos y cada uno de los ejemplos de ccode (código de empresa): count (empno) es 1839 para ccode 1 y count (empno) es 9421 para ccode 47. – balajibran

2

Sé que esto es una antiguo puesto, en SQL Server:

select isnull(town,'TOTAL') Town, count(*) cnt 
from user 
group by town WITH ROLLUP 

Town   cnt 
Copenhagen 58 
NewYork  58 
Athens  58 
TOTAL  174 
+4

Hay no hay nada de malo en responder mensajes antiguos. Sin embargo, incluya una explicación de su código y del código en sí. – Shelvacu

0

si quieres utilizar Seleccionar todo de consulta con la opción Conde, prueba este ...

select a.*, (Select count(b.name) from table_name as b where Condition) as totCount from table_name as a where where Condition 
+0

Gracias por este fragmento de código, que podría proporcionar alguna ayuda limitada e inmediata. Una explicación adecuada [mejoraría en gran medida] (// meta.stackexchange.com/q/114762) su valor a largo plazo mostrando * why * esta es una buena solución al problema, y ​​lo haría más útil para los lectores futuros con otras preguntas similares. Por favor [edite] su respuesta para agregar alguna explicación, incluidas las suposiciones que ha hecho. –

Cuestiones relacionadas