Contar el número de registros devueltos por el grupo por

¿Cómo cuento el número de registros devueltos por un grupo por consulta?

Por ejemplo:

select count(*) from temptable group by column_1, column_2, column_3, column_4 

Me da,

 1 1 2 

Necesito contar los registros anteriores para obtener 1 + 1 + 1 = 3.

Puede hacer ambas cosas en una consulta utilizando la cláusula OVER en otro COUNT

 select count(*) RecordsPerGroup, COUNT(*) OVER () AS TotalRecords from temptable group by column_1, column_2, column_3, column_4 

La solución más simple es usar una tabla derivada:

 Select Count(*) From ( Select ... From TempTable Group By column_1, column_2, column_3, column_4 ) As Z 

Otra solución es usar un Conde Distinct:

 Select ... , ( Select Count( Distinct column_1, column_2, column_3, column_4 ) From TempTable ) As CountOfItems From TempTable Group By column_1, column_2, column_3, column_4 

Sé que es bastante tarde, pero nadie sugirió esto:

 select count ( distinct column_1, column_2, column_3, column_4) from temptable 

Esto funciona al menos en Oracle: actualmente no tengo otras bases de datos para probarlo, y no estoy tan familiarizado con la syntax T-Sql y MySQL.

Además, no estoy del todo seguro de si es más eficiente en el analizador para hacerlo de esta manera, o si la solución de todos los demás de anidar la statement seleccionada es mejor. Pero creo que este es más elegante desde una perspectiva de encoding.

Estaba tratando de lograr lo mismo sin subconsulta y pude obtener el resultado requerido de la siguiente manera

 SELECT DISTINCT COUNT(*) OVER () AS TotalRecords FROM temptable GROUP BY column_1, column_2, column_3, column_4 

Un CTE funcionó para mí:

 with cte as ( select 1 col1 from temptable group by column_1 ) select COUNT(col1) from cte; 

Podrías hacerlo:

 select sum(counts) total_records from ( select count(*) as counts from temptable group by column_1, column_2, column_3, column_4 ) as tmp 

En PostgreSQL esto funciona para mí:

 select count(count.counts) from (select count(*) as counts from table group by concept) as count; 

¿Puedes ejecutar el siguiente código a continuación? Funcionó en Oracle.

 SELECT COUNT(COUNT(*)) FROM temptable GROUP BY column_1, column_2, column_3, column_4 

Qué tal si:

 SELECT count(column_1) FROM (SELECT * FROM temptable GROUP BY column_1, column_2, column_3, column_4) AS Records 

también puede obtener la consulta a continuación

 select column_group_by,count(*) as Coulm_name_to_be_displayed from Table group by Column; -- For example: select city,count(*) AS Count from people group by city 

Prueba esta consulta:

 select top 1 TotalRows = count(*) over () from yourTable group by column1, column2 

Lo siguiente para PrestDb , donde FirstField puede tener múltiples valores:

 select * , concat(cast(cast((ThirdTable.Total_Records_in_Group * 100 / ThirdTable.Total_Records_in_baseTable) as DECIMAL(5,2)) as varchar), '%') PERCENTage from ( SELECT FirstTable.FirstField, FirstTable.SecondField, SecondTable.Total_Records_in_baseTable, count(*) Total_Records_in_Group FROM BaseTable FirstTable JOIN ( SELECT FK1, count(*) AS Total_Records_in_baseTable FROM BaseTable GROUP BY FK1 ) SecondTable ON FirstTable.FirstField = SecondTable.FK1 GROUP BY FirstTable.FirstField, FirstTable.SecondField, SecondTable.Total_Records_in_baseTable ORDER BY FirstTable.FirstField, FirstTable.SecondField ) ThirdTable 

¿Qué le parece usar una función de particionamiento COUNT OVER (PARTITION BY {column to group by}) en SQL Server?

Por ejemplo, si desea agrupar las ventas de productos por ID de artículo y desea un recuento de cada ID de artículo, simplemente use:

 SELECT {columns you want} , COUNT(ItemID) OVER (PARTITION BY ItemID) as BandedItemCount , {more columns you want}... , FROM {MyTable} 

Si usa este enfoque, puede dejar GROUP BY fuera de la imagen, suponiendo que desea devolver toda la lista (ya que podría informar sobre bandas donde necesita saber el recuento completo de elementos que va a enganchar sin tener para mostrar todo el conjunto de datos, es decir, Reporting Services).