Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   consulta firebird 3 con IIF y group by (https://www.clubdelphi.com/foros/showthread.php?t=95521)

amadis 10-01-2022 19:32:19

consulta firebird 3 con IIF y group by
 
Buenas tardes compañeros.

Disculpen que no se me ocurrio un titulo mas claro

Pero la cuestion es la siguiente tengo una consulta para generar estadisticas de articulos vendidos.

Y necesito entre varias cosas calcular el margen de ganancia

I para evitar error de division por 0 uso IIF

Y resulta que al agregar esa linea me pide que agrupe por el campo detalleventa.costo (que es algo que no quiero porque no sirve)
Ese campo es siempre distinto, seria el ultimo costo del articulo vendido, y lo utilizo para calcular el costo promedio de un articulo a lo cargo del tiempo y como cambia no seria un campo para agrupar, pero al calcular con el IIF me pide que agrupe por ese campo.

¿de que forma podria evitar que me lo pida en group by?

Código SQL [-]
select 

detalleventa.art, detalleventa.descripcion, alicuotas.porcent, sum(detalleventa.costo* alicuotas.porcent)/sum(detalleventa.cant)as costoprom, articulos.costo as costoactual,
sum(detalleventa.total) as total, sum(detalleventa.cant) as cant, sum(detalleventa.cant) * articulos.peso as kilos,

  IIF ( (detalleventa.costo * alicuotas.porcent) > 0,(sum(detalleventa.total)/sum(detalleventa.cant))/(detalleventa.costo *  alicuotas.porcent), 0) as Margen

from detalleventa

inner join facturas
on detalleventa.numero = facturas.id

inner join articulos
on articulos.id = detalleventa.art

inner join alicuotas
on articulos.iva = alicuotas.id

where facturas.fecha > :fe

group by detalleventa.art, detalleventa.descripcion, alicuotas.porcent, articulos.costo, articulos.peso

order by cant asc

ASAPLTDA 14-01-2022 03:35:09

onsulta firebird 3 con IIF y group by
 
Buenas Noches,
con firebird3 puede usa una function sql y no necesita agrupar

kuan-yiu 14-01-2022 09:47:42

Puedes usar case que no necesita agrupar
Código SQL [-]
select loquesea, (CASE WHEN tuCondicion THEN esteCalculo ELSE esteOtroCalculo END) as Margen
from miTabla

amadis 15-01-2022 12:26:25

Cita:

Empezado por kuan-yiu (Mensaje 544906)
Puedes usar case que no necesita agrupar
Código SQL [-]
select loquesea, (CASE WHEN tuCondicion THEN esteCalculo ELSE esteOtroCalculo END) as Margen
from miTabla

Hola Buenos dias

Estoy intetando usar CASE de la siguiente manera, pero me sigue pidiendo que agrupe por el campo "detalleventa.costo"

para este caso del IIF

Código SQL [-]
 IIF ( (detalleventa.costo * alicuotas.porcent) > 0,(sum(detalleventa.total)/sum(detalleventa.cant))/(detalleventa.costo *  alicuotas.porcent), 0) as Margen

Lo he traducido al siguiente CASE

Código SQL [-]
 (CASE WHEN (detalleventa.costo * alicuotas.porcent) > 0  THEN (sum(detalleventa.total)/sum(detalleventa.cant))/(detalleventa.costo *  alicuotas.porcent) ELSE 0 END) as Margen

Y necesito agrupar por estos campos
group by detalleventa.art, detalleventa.descripcion, alicuotas.porcent, articulos.costo, articulos.peso

Para generar la estadistica y que quede una linea unica por articulo vendido (detalleventa.art es el ID de art ) con las sumatorias y promedios calculados de cada articulo

Y al pedirme que incorpore el campo detalleventa.costo (que es el ultimo costo de venta) como ese con la inflacion va cambiando a lo largo del tiempo no es unico y de pronto me encuentro con registros de articulos duplicados y agrupados por el costo de venta

amadis 15-01-2022 12:29:07

Cita:

Empezado por ASAPLTDA (Mensaje 544905)
Buenas Noches,
con firebird3 puede usa una function sql y no necesita agrupar

Que funcion deberia usar en lugar del IIF?

OJO que al resultado lo necesito agrupado por los campos deseados para que queda un registro por cada articulo existente, con los promedios y calculos de venta.

fjcg02 17-01-2022 15:51:06

Hola,

añade esto

IIF ( (detalleventa.costo * alicuotas.porcent) > 0

al group by

Saludos

amadis 18-01-2022 13:10:02

Cita:

Empezado por fjcg02 (Mensaje 544953)
Hola,

añade esto

IIF ( (detalleventa.costo * alicuotas.porcent) > 0

al group by

Saludos

Si agrego

Código SQL [-]
IIF ( (detalleventa.costo * alicuotas.porcent) > 0,(sum(detalleventa.total)/sum(detalleventa.cant))/(detalleventa.costo *  alicuotas.porcent), 0) as Margen

me da error del AS, le saco el as margen y da error

Cannot use an aggregate or window function in a GROUP BY clause

Pero no entiendo que agregarle IIF al group pueda ser la solucion.

Lo del case parece acercarse

Pero necesito agrupar el resultado por los campos que tengo en group by

kuan-yiu 18-01-2022 13:41:08

Si te pide otro campo agregado es que lo necesita. No hay más vuelta de rosca.

Añade al group by solo: ' (detalleventa.costo * alicuotas.porcent) ', con eso debería funcionar y luego haz una select de tu select para agrupar el resultado como tu quieres.
Tendrás que probar si tienes una equivalencia matemática con el resultado, porque esto parece un problema de mates no de SQL. O tendrás que tratar de calcularlo de otro modo. Siempre hay más de un sistema.

También puedes probar a construir primero una tabla con los cálculos que necesitas (tupla a tupla), sin agrupar y luego sobre esa select hacer otra agrupada:

Código SQL [-]
select sum(uno), sum(dos), tres, cuatro
from (
select tusCamposSinSumatoriosPeroConMultiplicacionesYcondiciones_UnoDosTresCuatro from tus tablas
where tuCondicion
) group by tres, cuatro

amadis 19-01-2022 14:36:14

No se me había ocurrido un Selec del otro Select, eso ayudó. Gracias a todos


La franja horaria es GMT +2. Ahora son las 14:05:16.

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