Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Se puede hacer consultas SQL condicionales con Firebird (https://www.clubdelphi.com/foros/showthread.php?t=54978)

David 04-04-2008 13:46:12

Se puede hacer consultas SQL condicionales con Firebird
 
Hola

tengo dos consultas, para averiguar un sólo valor, y es que dependiendo de unas condiciones, pues necesito un valor u otro. Pongo un ejemplo, con datos inventados.

Código SQL [-]
//primera query

SELECT EMPLEADO,SUM(TOTAL) AS IMPORTE
FROM FACTURAS
WHERE ((EMPLEADOIMPORTANTE IS NULL) OR (EMPLEADO = EMPLEADOIMPORTANTE))
GROUP BY EMPLEADO

//Segunda query
SELECT EMPLEADO,SUM(TOTAL * PORCENTAJE) AS IMPORTE
FROM FACTURAS
WHERE ((EMPLEADOIMPORTANTE IS NOT NULL) AND (EMPLEADO <> EMPLEADOIMPORTANTE))
GROUP BY EMPLEADO

Como veis necesito 2 querys para averiguar la cantidad importe, en este caso tengo dos Querys, calculo por separado el valor de importe y los sumo, pero se podría hacer esta consulta en una sola con algún tipo de condicional ?

Un saludo

duilioisola 04-04-2008 14:05:29

Creo que condiciones como IF ... THEN no hay, pero puedes resolverlo de otras maneras:

Si utilizas el UNION te devolverá los dos resultados unidos, como si fuera una sola consulta.
Código SQL [-]
SELECT EMPLEADO,SUM(TOTAL) AS IMPORTE
FROM FACTURAS
WHERE ((EMPLEADOIMPORTANTE IS NULL) OR (EMPLEADO = EMPLEADOIMPORTANTE))
GROUP BY EMPLEADO

UNION

SELECT EMPLEADO,SUM(TOTAL * PORCENTAJE) AS IMPORTE
FROM FACTURAS
WHERE ((EMPLEADOIMPORTANTE IS NOT NULL) AND (EMPLEADO <> EMPLEADOIMPORTANTE))
GROUP BY EMPLEADO

También puedes enviarle un parámetro para que ejecute una sola de las dos...

Código SQL [-]
SELECT EMPLEADO,SUM(TOTAL) AS IMPORTE
FROM FACTURAS
WHERE ((EMPLEADOIMPORTANTE IS NULL) OR (EMPLEADO = EMPLEADOIMPORTANTE)) AND (:EJECUTA=1)
GROUP BY EMPLEADO

UNION

SELECT EMPLEADO,SUM(TOTAL * PORCENTAJE) AS IMPORTE
FROM FACTURAS
WHERE ((EMPLEADOIMPORTANTE IS NOT NULL) AND (EMPLEADO <> EMPLEADOIMPORTANTE)) AND (:EJECUTA=2)
GROUP BY EMPLEADO

Ivanzinho 04-04-2008 15:34:54

Hola David puedes hacerlo utilizando la sentencia Case When, la cosa quedaría de la siguiente manera.
Código SQL [-]
Select empleado, case when (empleadoimportante is null or empleado = empleadoimportante) then
                   sum(total)
                 else when (empleadoimportante is not null and empleado <> empleado importante) then
                   sum(total * porcentaje)
                 else
                   lo que corresponda
                 end as importe
 group by empleado

Espero que te sirva

Un saúdo.


La franja horaria es GMT +2. Ahora son las 19:03:27.

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