sábado, 27 de septiembre de 2008

DEVOLVER N REGISTROS (PAGINAR)


Para que una consulta devuelva una cantidad concreta de registros, utilizamos la cláusula top :

Select Top 10 * From Pedidos;

O bien, si en vez de una cantidad, queremos un porcentaje :

Select Top 10 Percent * From Pedidos;

Pero puede presentarse la siguiente necesidad : Obtener n registros por grupo (ver http://groups.google.es/group/microsoft.public.es.access/browse_thread/thread/e50cf402a9916ebb#)
En este ejemplo, evidentemente no nos sirve utilizar 'Top'. Una solución podría ser emplear una subconsulta que evaluara el número de registros devueltos para cada grupo. Y poner como condición que dicho número sea igual a n :

Ejemplo preparado para ejecutar desde el Editor Sql 1.2 http://groups.google.com/group/raipon?hl=es

Parameters n Long;

Create Table Tareas (id Long Primary Key, titulo Text (255), ambito Text (255), prioridad Bit);
Create Table Avance_Tareas (id Long, fecha_avance DateTime, descripcion Text (255));

Insert Into Tareas Values (1, 'Primera', Null, Null);
Insert Into Tareas Values (2, 'Segunda', Null, Null);

Insert Into Avance_Tareas Values (1, #09/30/2008#, Null);
Insert Into Avance_Tareas Values (1, #10/01/2008#, Null);
Insert Into Avance_Tareas Values (1, #10/02/2008#, Null);
Insert Into Avance_Tareas Values (1, #10/06/2008#, Null);

Insert Into Avance_Tareas Values (2, #09/30/2007#, Null);
Insert Into Avance_Tareas Values (2, #10/10/2007#, Null);
Insert Into Avance_Tareas Values (2, #10/11/2007#, Null);
Insert Into Avance_Tareas Values (2, #10/10/2008#, Null);

Select tareas.titulo, tareas.ambito, tareas.prioridad,
avance_tareas.fecha_avance, avance_tareas.descripcion
From tareas Inner Join Avance_Tareas
On tareas.id = Avance_Tareas.id
Where
(Select Count(*) From avance_tareas As T
Where T.id = tareas.Id And T.fecha_avance >= Avance_Tareas.fecha_avance) <= n;

Drop Table Tareas;
Drop Table Avance_Tareas;

Ramon Poch. Terrassa a 10/10/2008.