![]() |
![]() |
![]() |
![]() |
![]() |
FTP | ![]() |
![]() |
CCD | ![]() |
![]() |
Buscar | ![]() |
![]() |
Trucos | ![]() |
![]() |
Trabajo | ![]() |
![]() |
Foros | ![]() |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
![]() |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
¿se puede hacer esto en una instrucción sql?
Un saludo para todos.
necesito seleccionar una serie de registros con tres campos: NOMBRE, FECHA VENCIMIENTO, IMPORTE)de una tabla (firebird) que cumplan dos condiciones: 1.- que los registros seleccionados estén entre un rango de fechas (FECHA VENCIMIENTO, es fácil) 2.- que la suma del campo IMPORTE de los registros seleccionados, no supere un importe determinado (vendrá de un tedit). ¿Es posible hacerlo con una instrucción sql o tendré que recorrer la tabla? Estoy utilizando firebird y dbexpres. Gracias por adelantado. |
#2
|
||||
|
||||
Claro, para filtrar un agregado como SUM utiliza la clausula HAVING:
https://www.w3schools.com/sql/sql_having.asp
__________________
El malabarista. |
#3
|
|||
|
|||
Y como seria? porque esto me da error:
Invalid token. Dynamic SQL Error. SQL error code = -104. Invalid expression in the select list (not contained in either an aggregate function or the GROUP BY clause). lo estoy probando con IBEXPERT antes de hacerlo con DELPHI |
#4
|
||||
|
||||
te falta agregar el campo Nombre en el group Group by nombre, fechavto
__________________
Dulce Regalo que Satanas manda para mi..... |
#5
|
|||
|
|||
Cita:
* ¿Una fila por cada uno de los recibos del cliente ? * ¿Una única fila con la suma total de los recibos de cada cliente por día? Porque dependiendo de lo que necesites realmente, el sql cambiará un poco. |
#6
|
||||
|
||||
Cita:
plantea mejor tu consulta, si puedes pon un ejemplo con datos y los resultados que buscas
__________________
Dulce Regalo que Satanas manda para mi..... |
#7
|
|||
|
|||
Efectivamente, quiero que me salga una linea (registro) por cada fecha de vencimiento (con su nombre, su fecha de vencimiento y su importe) pero hasta que la suma de los importes seleccionados sea menor o igual que una cantidad determinada (en delphi vendrá de un tedit).
ejemplo: Suma de importes : 100€ CLIENTE FECHA IMPORTE cliente 1 21-09-2017 40 cliente 2 22-09-2017 30 cliente 3 23-09-2017 20 cliente 4 23-09-2017 30 cliente 5 23-09-2017 20 El sql debe seleccionar cliente1,cliente2 y cliente3, porque si seleccionamos cliente 4, ya sobrepasamos el importe máximo que tenemos que seleccionar Perdón si no he sabido expresarme mejor. Y sobretodo gracias por vuestro tiempo. |
#8
|
||||
|
||||
Cliente 1, 2 y 3 es el mismo cliente?
__________________
Dulce Regalo que Satanas manda para mi..... |
#9
|
|||
|
|||
Normalmente no, pero en algún caso excepcional pudiera darse el caso.
|
#10
|
||||
|
||||
ah ya
entonces tu quieres una relacion de los n primeros clientes cuya suma de importes por fecha de vencimiento sea menor a X (tu edit)
__________________
Dulce Regalo que Satanas manda para mi..... |
#11
|
|||
|
|||
Eso es lo que necesito.
|
#12
|
|||
|
|||
Entonces creo que lo que necesitas es algo así:
Código:
SELECT NOMBRE, FECHAVTO, SUM(IMPORTE) AS Total FROM VTOSCOBR where FECHAVTO between '2017-04-28' and '2017-05-01' group by NOMBRE, FECHAVTO having (sum(importe) < 1000) --ORDER by LO QUE QUIERAS..... |
#13
|
|||
|
|||
No es eso lo que busco.
Lo que intento sacar es todos los vencimientos comprendidos entre dos fecha (independientemente de si es el mismo cliente o es la misma fecha) pero (y aquí viene la cuestión) que la suma de lo que voy seleccionando( el importe total , no la suma del importe por cliente ) no supere el importe que le diga. En forma de bucle seria: leo registro 1 ; sumimporte = sumimporte + importe si sumimporte > importeseleccionado salgo del bucle si no leo registro2 sumimporte = sumimporte + importe si sumimporte > importeseleccionado salgo del bucle sino leo registro3...... algo así pero en forma de sql gracias nincillo |
#14
|
|||
|
|||
Me temo que eso para un sql "normal" es bastante complicado.
Creo que tendrías que hacerlo utilizando algún cursor o algo así. |
#15
|
||||
|
||||
Es posible con Sql normal, pero todo depende del motor y su version. En el caso de Firebird, desde la version 3:
https://www.firebirdsql.org/file/com...3windowing.pdf
__________________
El malabarista. |
#16
|
|||
|
|||
Cita:
Pero no son horas para digerir algo tan "denso". Me lo apunto para mañana, pero me implicaría cambiar a la versión 3, que hasta ahora no había pasado de la 2.5 por temor a incompatibilidades. |
#17
|
||||
|
||||
Pero las funciones windows LO VALEN. Son geniales y resuelven un montón de escenarios.
P.D: Y si uno tiene la opción, es bueno siempre ir actualizando el motor a lo ultimo. No solo porque por lo general mejoran desempeño y resuelven bugs, sino porque el SQL se ha ido actualizando! A proposito, asi es como quedaria:
__________________
El malabarista. |
#18
|
||||
|
||||
Cita:
![]()
__________________
La otra guía de estilo | Búsquedas avanzadas | Etiquetas para código | Colabora mediante Paypal |
#19
|
|||
|
|||
Genial!!
El problema es que trabajo con firebird 2.5 Hay que estudiar la posibilidad del cambio. |
![]() |
|
|
![]() |
||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Tu mac puede hacer esto????? | AzidRain | Humor | 10 | 24-11-2010 00:16:25 |
Se puede hacer esto? | Migpal | OOP | 3 | 22-10-2005 20:02:30 |
Se puede hacer esto ??????? | AMINOA2R | Firebird e Interbase | 2 | 21-10-2005 17:50:59 |
Se puede hacer esto en POO? | adlfv | OOP | 8 | 26-09-2005 16:28:55 |
![]() |
|