una total repetidos registros obtener numero filas distintos contar consulta condicion agrupados afectadas sql sql-server

total - Consulta de SQLServer SQL con un contador de filas



sql contar registros condicion (4)

Tengo una consulta SQL, que devuelve un conjunto de filas:

SELECT id, name FROM users where group = 2

También necesito incluir una columna que tenga un valor entero creciente, por lo que la primera fila debe tener un 1 en la columna del contador, la segunda un 2, la tercera un 3, etc.

La consulta que se muestra aquí es solo un ejemplo simplificado, en realidad la consulta podría ser arbitrariamente compleja, con varias combinaciones y consultas anidadas.

Sé que esto podría lograrse usando una tabla temporal con un campo de autonumeración, pero ¿hay alguna forma de hacerlo dentro de la consulta misma?


En SQL Server 2005 y ROW_NUMBER() posteriores, puede usar la función ROW_NUMBER() , que tiene opciones para el orden de clasificación y los grupos sobre los que se realizan los recuentos (y restablecer).


Para empezar, algo como:

SELECT my_first_column, my_second_column, ROW_NUMBER() OVER (ORDER BY my_order_column) AS Row_Counter FROM my_table

Sin embargo, es importante tener en cuenta que la ROW_NUMBER() OVER (ORDER BY ...) solo determina los valores de Row_Counter , no garantiza el orden de los resultados.

A menos que SELECT tenga una cláusula ORDER BY explícita, los resultados se pueden devolver en cualquier orden, dependiendo de cómo SQL Server decida optimizar la consulta. ( Ver este artículo para más información )

La única manera de garantizar que los resultados siempre se devolverán en el orden Row_Counter es aplicar exactamente el mismo orden tanto a SELECT como a ROW_NUMBER() :

SELECT my_first_column, my_second_column, ROW_NUMBER() OVER (ORDER BY my_order_column) AS Row_Counter FROM my_table ORDER BY my_order_column -- exact copy of the ordering used for Row_Counter

El patrón anterior siempre devolverá resultados en el orden correcto y funciona bien para consultas simples, pero ¿qué pasa con una consulta "arbitrariamente compleja" con quizás docenas de expresiones en la cláusula ORDER BY ? En esas situaciones prefiero algo como esto en su lugar:

SELECT t.* FROM ( SELECT my_first_column, my_second_column, ROW_NUMBER() OVER (ORDER BY ...) AS Row_Counter -- complex ordering FROM my_table ) AS t ORDER BY t.Row_Counter

El uso de una consulta anidada significa que no hay necesidad de duplicar la complicada cláusula ORDER BY , lo que significa menos desorden y un mantenimiento más sencillo. El ORDER BY t.Row_Counter también hace que la intención de la consulta sea mucho más clara para tus compañeros desarrolladores.


Aquí hay un enfoque diferente. Si tiene varias tablas de datos que no se pueden unir, o si por algún motivo no desea contar todas las filas al mismo tiempo pero aún desea que formen parte del mismo recuento de filas, puede crear una tabla que haga el trabajo para ti.

Ejemplo:

create table #test ( rowcounter int identity, invoicenumber varchar(30) ) insert into #test(invoicenumber) select [column] from [Table1] insert into #test(invoicenumber) select [column] from [Table2] insert into #test(invoicenumber) select [column] from [Table3] select * from #test drop table #test


La forma más sencilla es utilizar un contador de filas variable. Sin embargo, serían dos comandos SQL reales. Uno para establecer la variable, y luego la consulta de la siguiente manera:

SET @n=0; SELECT @n:=@n+1, a.* FROM tablename a

Su consulta puede ser tan compleja como desee con combinaciones, etc. Por lo general, hago de esto un procedimiento almacenado. Puede tener todo tipo de diversión con la variable, incluso usarla para calcular contra valores de campo. La clave es la :=