Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Condición para un SELECT (https://www.clubdelphi.com/foros/showthread.php?t=92811)

Angel.Matilla 08-02-2018 13:29:12

Condición para un SELECT
 
Tengo este query en FB 2.5 a partir de una vista:
Código PHP:

SELECT DISTINCT CodigoEXTRACT(MONTH FROM MAX(Fecha)), SituacionPeriodo
FROM Rc03 
WHERE 
(Fecha < :Fecha OR Fecha IS NULL)
AND 
Periodo 'Anual'
GROUP BY 134 ORDER BY 43

Evidentemente así me devolverá filas en las que la segunda columna valga 1, 2, 3... o NULL si es que no hay fecha. Ahora necesito, a partir de esa misma consulta, sacar solamente aquellos registros correspondientes al mes 2. Había pensado algo así:
Código PHP:

SELECT DISTINCT CodigoEXTRACT(MONTH FROM MAX(Fecha)), SituacionPeriodo
FROM Rc03 
WHERE 
(Fecha < :Fecha OR Fecha IS NULL)
AND 
Periodo 'Anual'
AND EXTRACT(MONTH FROM MAX(Fecha)) = 2
GROUP BY 1
34 ORDER BY 43

Sin embargo, y esto tampoco lo sabía porque no se me había dado nunca una situación parecida, he decubierto que dentro de un WHERE no puede ponerse campos agregados como el MAX(Fecha). Según el mesaje de error de FB debería usar la claúsula HAVING pero, sinceramente, por más que leo sobre ella no acabo de comprender como funciona; ¿debería ser algo así?
Código PHP:

SELECT DISTINCT CodigoEXTRACT(MONTH FROM MAX(Fecha)), SituacionPeriodo
FROM Rc03 
WHERE 
(Fecha < :Fecha OR Fecha IS NULL)
AND 
Periodo 'Anual'
GROUP BY 13
HAVING EXTRACT
(MONTH FROM MAX(Fecha)) = 2
ORDER BY 4
3


jhonny 08-02-2018 14:04:10

Imagina que sin el having la consulta te devuelve algo como:

Cita:

1, 2, 'AlDia', 'Anual'
2, 2, 'AlDia', 'Anual'
3, 2, 'EnMora', 'Mensual'
4, 3, 'AlDia', 'Anual'
5, 4, 'AlDia', 'Anual'
Si a ello le aplicas el having que mencionas... "HAVING EXTRACT(MONTH FROM MAX(Fecha)) = 2", entonces sobre la consulta anterior Firebird aplicaría otro filtro más... (Como si de una "minitabla" se tratara), quedando así... ya que le has dicho que solamente te interesan los meses de febrero...

Cita:

1, 2, 'AlDia', 'Anual'
2, 2, 'AlDia', 'Anual'
3, 2, 'EnMora', 'Mensual'

Ahora bien, para este caso en particular, lo mismo deberías lograr si haces desde el principio lo siguiente:

Código SQL [-]
SELECT DISTINCT Codigo, EXTRACT(MONTH FROM MAX(Fecha)), Situacion, Periodo
FROM Rc03 
WHERE (Fecha < :Fecha OR Fecha IS NULL)
AND Periodo = 'Anual'
AND EXTRACT(MONTH FROM Fecha) = 2
GROUP BY 1, 3, 4 ORDER BY 4, 3, 2

manelb 08-02-2018 21:30:18

La cláusula where evalua cada uno de los registros de la tabla de forma individual para valorar si la fila entra o no en el resultado final de la consulta.

El having evalua la función agregada en cuestión una vez evaluados los registros para valorar si la fila resultante, que puede corresponder a varios registros, debe formar parte del resultado de la consulta.

En tu caso, tal y como apunta jhonny, debería funcionar la consulta que te propone aunque creo que podrías omitir el
Código SQL [-]
OR Fecha IS NULL
por dos cuestiones
1.- Creo recordar que las funciones agregadas omiten directament los valore null
2.- Al especificar
Código SQL [-]
AND EXTRACT(MONTH FROM Fecha) = 2
estas descartando directamente los valores null para la fecha

Saludos

Angel.Matilla 09-02-2018 11:31:44

Gracias por vuestras respuestas. Me han sido muy útiles.


La franja horaria es GMT +2. Ahora son las 22:54:59.

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