jueves, 15 de marzo de 2012

Cómo numerar dinámicamente filas en una instrucción SELECT de Transact-SQL

En este artículo se describe cómo clasificar dinámicamente filas cuando realiza una instrucción SELECT mediante un método flexible que puede ser la única solución posible y que es más rápido que la solución del procedimiento. La numeración u ordenación de filas es un problema de procedimiento bastante habitual. Las soluciones normalmente se basan en bucles y tablas temporales; por lo tanto, se basan en SQL Server bucles y cursores. Esta técnica se basa en una instrucción AUTO JOIN. La relación elegida es normalmente "es mayor que". Cuenta cuántas veces cada elemento de un conjunto de datos determinado cumple la relación "es mayor que" cuando se compara el conjunto a sí mismo.


Ejemplo 1

en este ejemplo:
El conjunto 1 es authors.
Conjunto 2 es authors.
La relación es "el nombre y el apellido son mayores que"
Puede evitar el problema duplicado comparando los nombres de los demás nombres primero + últimos primero + últimos.
Contar el número de veces que se cumple la relación por count(*).
consulta :
select rank=count(*), a1.au_lname, a1.au_fname
from authors a1, authors a2
where a1.au_lname + a1.au_fname >= a2.au_lname + a2.au_fname
group by a1.au_lname, a1.au_fname
order by rank

utilice el código siguiente en SQL Server 2005 o superior.
select rank() OVER (ORDER BY a.au_lname, a.au_fname) as rank, a.au_lname, a.au_fname
from authors a
order by rank
resultado :
Rank Au_Lname Au_Fname
---- -------------- -----------
1 Bennet Abraham
2 Blotchet-Halls Reginald
3 Carson Cheryl
4 DeFrance Michel
5 del Castillo Innes
6 Dull Ann
7 Greene Morningstar
8 Green Marjorie
9 Gringlesby Burt
10 Hunter Sheryl
11 Karsen Livia
12 Locksley Charlene
13 MacFeather Stearns
14 McBadden Heather
15 O'Leary Michael
16 Panteley Sylvia
17 Ringer Albert
18 Ringer Anne
19 Smith Meander
20 Straight Dean
21 Stringer Dirk
22 White Johnson
23 Yokomoto Akiko

(23 row(s) affected)

EJEMPLO # 2

Mostrar una columna con la secuencia de las filas en un select simple de datos de empleados:

Select row_number() over(order by COD_EMPLEADO desc) as NUMERO_FILA , NOMBRE_EMPLE, APELLIDO_EMPLE
From Empleados

=================
RESULTADOS:
=================
NUMERO_FILA       COD_EMPLEADO NOMBRE_EMPLE    APELLIDO_EMPLE
1                            1                            JULIO                     PEREZ
2                            2                            MARIA                    CRUZ
3                            3                            JULIA                      RUIZ
4                            4                            MARCOS                 DIAZ
5                            5                            MASSIEL                ALMANZAR

.

No hay comentarios:

Publicar un comentario