Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General »

Acumulador en un select???

Estas en el tema de Acumulador en un select??? en el foro de Bases de Datos General en Foros del Web. Holas, Necesito que alguien me ayude con una consulta... tengo la tabla t1 id monto 1 10 tabla t2 id monto 1 5 1 3 ...
  #1 (permalink)  
Antiguo 21/07/2008, 09:50
 
Fecha de Ingreso: agosto-2006
Mensajes: 50
Antigüedad: 17 años, 8 meses
Puntos: 0
Acumulador en un select???

Holas,
Necesito que alguien me ayude con una consulta...

tengo la tabla t1

id monto
1 10

tabla t2
id monto
1 5
1 3
1 1
1 3

como hago para sacar los registros de la tabla t2 mientras el monto acumulado sea menor o igual al monto de la tabla t1??

por ejemplo, aca deberia devolver los primeros 3 registros de la tabla t2, ya que 5+3+1 = 9
el ultimo no lo deberia tomar porque se pasaria de 10 (5+3+1+3=12)

Gracias!!
  #2 (permalink)  
Antiguo 22/07/2008, 06:32
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Acumulador en un select???

La teoria dice que el orden introducción de los registros no debe importar en una base de datos relacional, el ejemplo que nos das no cumple este principio puesto que el resultado de la consulta que piedes, si la solucionamos, dependerá del orden en que se lean los registros de la t2 y tal como esta no tienes nada que los ordene...

Si quieres un resultado en función de un orden determinado de lectura de los registros este orden debe depender del contenido de un campo, no del orden de introducción del registro. Esto es solucionable con los id autoincrementales.

Reformulo tu ejemplo:

id monto
1----10

tabla t2
id idt1 monto
1--- 1 --- 5
2--- 1 --- 3
3--- 1 --- 1
4--- 1 --- 3


ahora si podemos apoyarnos en el valor del id de la tabla 2 para indicar como queremos ordenar los registros.

Vamos a intentar la consulta:

Código:
Select t2.id, 
           t2.idt1, 
           t2.monto,
          (select sum(aux.monto) 
                     from t2 as aux 
                     where aux.idt1=t2.idt1 
                     and aux.id<=t2.id) as cummonto
from t2 inner join t1
        on t1.id=t2.idt1
where (select sum(aux.monto) 
                      from t2 as aux 
                      where aux.idt1=t2.idt1 
                      and aux.id<=t2.id)<=t1.monto
order by t2.id;
Creo que funciona!!

Quim
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 20:50.