PDA

Ver la Versión Completa : Consulta usando group by


jfloro
01-08-2003, 17:44:08
Hola, tengo la siguiente consulta a la que quiero añadir unos datos mas de las lineas de factura(concretamente sumatorios de cantidades) y inicialmente tengo esto:

Select F.IdFactura,F.IdCliente,C.Representante,F.Total,C.DNICIF,
R.IdComercial, F.Fecha, C.Nombre, F.Subtotal,F.SubtotalAlbaran, R.Comision,
F.IVA,(F.SubtotalAlbaran * R.Comision) / 100 as vComision,
((F.SubtotalAlbaran * R.Comision) / 100 * R.IRPF) / 100 as vIRPF
from Factura F , Clientes C,Comerciales R
where F.IdCliente = C.IdCliente and C.Representante =:Comercial
and F.Fecha>=:FechaDesde and F.Fecha<=:FechaHasta
and R.IdComercial =:Comercial
Order By F.Fecha

// Calcula comisiones de comerciales, pero quiero sumar por importes de lineas y al añadir la clausula GROUP BY me da un error

Añado lo siguiente:

Select F.IdFactura,F.IdCliente,C.Representante,F.Total,C.DNICIF,
R.IdComercial, F.Fecha, C.Nombre, F.Subtotal,F.SubtotalAlbaran, R.Comision,
F.IVA,(F.SubtotalAlbaran * R.Comision) / 100 as vComision,
((F.SubtotalAlbaran * R.Comision) / 100 * R.IRPF) / 100 as vIRPF
from Factura F , Clientes C,Comerciales R
where F.IdCliente = C.IdCliente and C.Representante =:Comercial
and F.Fecha>=:FechaDesde and F.Fecha<=:FechaHasta
and R.IdComercial =:Comercial

GROUP BY F.IdFactura,F.IdCliente,C.Representante,F.Total,C.DNICIF,
R.IdComercial, F.Fecha, C.Nombre, F.Subtotal,F.SubtotalAlbaran, R.Comision,F.IVA
Order By F.Fecha

Y El error que me sale en pantalla es este:

Expressions in group by are not supported.

¿Creo que me sobran campos o me faltan en el GROUP BY??
¿Cuales son y como he de ponerlos??
Gracias

Resuelto esto podre introducir la parte relacionada con las lineas de factura.

__marcsc
01-08-2003, 18:13:26
Hola,

a ver un pequeño ejemplo de Group By...

Digamos que el group by lo qe hace es aplicar una función a un conjunto de valores para devolver un resultado.

Digamoslo así

Función(registro 1, ..., registro N) -> Resultado.

El número de registros a los que se aplica la función viene determinado por los campos por los que se agrupa. Por ejemplo:



Select * from Facturas

Cliente Factura Importe
------- -------------------- ----------
PEPE 1 300
PEPE 2 200
MANOLO 3 200
MANOLO 4 1000



Ahora, si lo que queremos es agrupar por cliente:



Select Cliente, Sum(Importe) as Total from Facturas
Group By Cliente

Cliente Total
-------- -------
PEPE 500
MANOLO 1200



Es decir, lo que ha hecho ha sido agrupar todas las facturas de un mismo cliente y para ese grupo y sumar todos los importes.


Si revisas tu segundo SQL, es decir, el que tiene el Group by, observarás que no tienes ninguna función de agregado, con lo que realmente no tiene sentido utilizar el group by. Es decir, para qué agrupar si no tienes ningún dato extra que obtener?

Seguramente lo que realmente quieres hacer es calcular la suma de los albaranes y de las comisiones.

A ver si con esto ya puedes conseguir los datos que quieres. Para cualquier otra duda aquí estamos.

Saludos.

guillotmarc
01-08-2003, 19:08:07
Hola.

Una posible razón para utilizar una consulta con group by, pero sin ninguna función de agregado, puede ser porqué en el resultado no queremos que se repitan registros.

Aunque en este caso es más elegante (y seguramente más eficiente) utilizar la clausula distinct.

select poblacion, provincia
from clientes
group by poblacion, provincia

equivale a :

select distinct poblacion, provincia from clientes

No indicas que base de datos utilizas, en un Servidor SQL tu consulta con una expresión formada por campos presentes en la lista del group by, no debería darte ningún problema. Si utilizas en cambio alguna tabla plana como Paradox, etc. ... quizá estas consultas no estén soportadas.

Saludos.

dabas
08-08-2003, 02:56:33
resumiendo, creo que se haria de esta manera:

modificar el select aplicando la funcion suma a las cantidades que se desean sumar,

Select F.IdFactura,
F.IdCliente,
C.Representante,
sum(F.Total),
C.DNICIF,
R.IdComercial,
F.Fecha,
C.Nombre,
sum(F.Subtotal),
sum(F.SubtotalAlbaran)
..........

el la linea group by agrupar por el resto de campos que no llevan funcion de agregado.

espero haber ayudado.