Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Consulta Limitada (https://www.clubdelphi.com/foros/showthread.php?t=15691)

JANDREGUE 02-11-2004 03:34:07

Consulta Limitada
 
Hola amigos,

Tengo un Problema... En una tabla tengo los siguientes campos Cliente, Factura y Valor_Factura. Necesito contar los campos de esta tabla ordenados por Valor_Factura descendentemente, pero solo hasta que la sumatoria del Campo Valor_Factura No sea mayor a un valor dado..por ej:$500.000.. Es decir me interesa saber ¿Cuántas Facturas suman $500.000. o al menos se aproxime ordenadas como les dije ya por el campo del valor en forma descendente.....

Espero haberme hecho entender... Si puden ayudarme les agradezco de antemano.

buitrago_listas 02-11-2004 07:15:19

Parece
 
Que es una solucion de Where, en verdad, no te haces entender, o es que es tan simple la respuesta.

Saludos

Fer

buitrago_listas 02-11-2004 07:18:05

algo asi
 
Select count(*) from facturas
where monto_factura < 500000

Para contar, no te hace falta orden...si, parece que no te he entendido...o si.?

Saludos

Otra vez Fer

JANDREGUE 02-11-2004 15:14:51

Reconfirmación
 
Es que lo que pasa es esto:

La tabla seria asi: Ordenada por valor descendentemente
Cliente Factura Valor
Julio G. 00001 180.000
Antonio 00005 120.000
Andres 00002 90.000
Maria 00008 50.000
Josefa 00007 40.000
Camilo 00004 20.000

Ahora necesito contar los registros hasta que la suma de los valores de la factura sea menor o igual a $400.000
La Repuesta seria (3) Por que la sumatoria de los tres primeros registros 180.000+120.000+90.000=390.000
si le sumamos el cuarto registro se pasaria a 440.000 y el limite es $400.000... espero que ahora me halla hecho entender mejor

frudolph 02-11-2004 17:01:41

Si estás trabajando con una base de datos relacional (Interbase, Firebird, Oracle, SQL-Server, Informix, DB2, MySQL u otra), la mejor opción sería a través de un procedimiento almacenado que recorra la tabla y acumule en una variable local al procedimiento el total. Cuando llegues al monto deseado (antes de que te pases), deberías cortar el recorrido de la tabla y devolver el último valor.

Otra opción es a través de un método, función o procedimiento directamente con Delphi haciendo lo mismo (recorrer la tabla e ir acumulando hasta alcanzar el valor).

Por supuesto lo primero que tienes que hacer (antes de acumular) ver si te pasas o no del vaor deseado y luego: acumular; o cortar el procedimiento.

Esto es fácil siempre que lo que necesites sea recorrer la tabla secuencialmente; ahora bien, si lo que necesitas es calcular el valor más aproximado, considerando todos los registros posibles, ya tienes que recurrir a un procedimiento recursivo y ver que sumatoria (de las posibles) te cae mejor. Por supuesto, esto llevaría mucho más tiempo de procesamiento y muchos más recursos (memoria).

JANDREGUE 02-11-2004 17:37:51

Para Fudolph
 
Amigo Fudolph ...

Agradezco tu recomendacion... yo lo habia craneado asi... pero pense que depronto por SQL.. podia encontrar una consulta condicionada que me diera el dato rapidamente. estoy trabajando con Interbase

De todas formas gracias por las recomendaciones

JANDREGUE 02-11-2004 17:46:04

Se me ocurrio otra cosa
 
Hola..Pensando otra cosa ...

Alguien sabe como por SQL.. puedo seleccionar los 10,20,30....n... mejores campos de una tabla?

Es decir como un Top 10


Gracias

frudolph 05-11-2004 17:29:19

Nuevamente, depende del motor con el que estás trabajando (cosa que deberías indicar). Igual, si se trata de Firebird 1.5 (no Interbase), la consulta debería tener la forma:

"select first n * from..."

No recuerdo exactamente, pero creo que también era posible hacer ago por el estilo en Oracle.

Sino, la otra opción es a través de un procedimiento almacenado, donde le deberías pasar la cantida de registros a mostrar y procesar la tabla a través de un "for do.." o un "for each..." (según el motor) y una variable de control, hasta llegar a la cantidad que necesites para luego terminar el procedimiento.


La franja horaria es GMT +2. Ahora son las 16:45:21.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi