2011-11-11 8 views
5

Necesito obtener el recuento de filas de una consulta, y también obtener las columnas de la consulta en una sola consulta. El recuento debe ser una parte de las columnas del resultado (debe ser el mismo para todas las filas, ya que es el total).Obtener recuento de filas incluyendo valores de columna en el servidor sql

por ejemplo, si hago esto: select count(1) from table que puede tener el número total de filas.

Si hago esto: select a,b,c from table Obtendré los valores de la columna para la consulta.

Lo que necesito es obtener los valores de recuento y columnas en una consulta, de una manera muy efectiva.

Por ejemplo: select Count(1), a,b,c from table sin grupo, ya que quiero el total.

La única forma que he encontrado es hacer una tabla temporal (usando variables), insertar el resultado de la consulta, luego contar y luego devolver la combinación de ambos. Pero si el resultado obtiene miles de registros, eso no sería muy eficiente.

¿Alguna idea?

Respuesta

8

@Jim H es casi correcta, pero elige la función de clasificación errónea:

create table #T (ID int) 
insert into #T (ID) 
select 1 union all 
select 2 union all 
select 3 
select ID,COUNT(*) OVER (PARTITION BY 1) as RowCnt from #T 
drop table #T 

Resultados:

ID RowCnt 
1 3 
2 3 
3 3 

Partición por una constante lo hace contar sobre todo el conjunto de resultados.

+0

Este parece el único en el que no tengo que duplicar la consulta, ¡pero plantea dudas sobre el rendimiento! Me quedo con esta solución. –

+1

FYI, también puede usar una cláusula OVER vacía http://stackoverflow.com/a/5147055/27535 – gbn

0

Se podía hacerlo de esta manera:

SELECT x.total, a, b, c 
FROM 
    table 
    JOIN (SELECT total = COUNT(*) FROM table) AS x ON 1=1 

que devolverá el número total de registros en la primera columna, seguido de los campos a, b & c

+0

Igual que el primero, estoy tratando de evitar duplicar la consulta, gracias de todos modos. –

1

Mira las Ranking funciones de SQL Servidor.

SELECT ROW_NUMBER() OVER (ORDER BY a) AS 'RowNumber', a, b, c 
FROM table; 
+0

El OP quiere el mismo valor para cada fila; esto proporcionará un número único y secuencial para cada fila. –

5

Usando CROSS JOIN:

SELECT a.*, b.numRows 
     FROM YOUR_TABLE a 
CROSS JOIN (SELECT COUNT(*) AS numRows 
       FROM YOUR_TABLE) b 
+0

Gracias, esto me hará hacer la consulta dos veces ... Trato de evitar esto, pero no he encontrado la manera. –

Cuestiones relacionadas