![]() |
¿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. |
Claro, para filtrar un agregado como SUM utiliza la clausula HAVING:
https://www.w3schools.com/sql/sql_having.asp |
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 |
te falta agregar el campo Nombre en el group Group by nombre, fechavto |
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. |
Cita:
plantea mejor tu consulta, si puedes pon un ejemplo con datos y los resultados que buscas |
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. |
Cliente 1, 2 y 3 es el mismo cliente?
|
Normalmente no, pero en algún caso excepcional pudiera darse el caso.
|
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) |
Eso es lo que necesito.
|
Cita:
Código:
SELECT NOMBRE, FECHAVTO, SUM(IMPORTE) AS Total |
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 |
Me temo que eso para un sql "normal" es bastante complicado.
Creo que tendrías que hacerlo utilizando algún cursor o algo así. |
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 |
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. |
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:
|
Cita:
|
Genial!!
El problema es que trabajo con firebird 2.5 Hay que estudiar la posibilidad del cambio. |
La franja horaria es GMT +2. Ahora son las 06:08:52. |
Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi