GROUP BY Y HAVING

Cuando se agrupan filas a través de GROUP BY también se puede optar por restringir las filas de salida de acuerdo a los resultados de agrupamiento a través de HAVING.
Así como en la cláusula WHERE se restringen las filas de salida de acuerdo a condiciones lógicas antes del agrupamiento, HAVING permite restricción de filas posteriores al agrupamiento.

Veamos algunos ejemplos:
Obtener los productos que generaron ingresos superiores a 40000:
SELECT pr_id, sum(det_cantidad*det_precio)
FROM Detalles
GROUP BY pr_id
HAVING sum(det_cantidad*det_precio) >40000


Listar aquellos productos que se vendieron mas de 100 veces en el mes actual
SELECT pr_id, count(*)
FROM Detalles d, FactVent f
WHERE
d.fv_tipo = f.fv_tipo AND
d.fv_nro = f.fv_nro AND
month(fv_fecha) = month(getdate()) AND

year(fv_fecha) = year(getdate())
GROUP BY pr_id
HAVING count(*) > 100


Observe que en primer lugar se indican las condiciones de reunion y de filtros en el WHERE las cuales se llevarán a cabo antes del agrupamiento y luego de agrupar, recién se filtrarán aquellos grupos que tengan mas de 100 filas

2 comentarios:

Unknown dijo...

esta bueno pero si quiero la descripcion del productos, si me sale, pero no con subconsulta
/* UTILIZANDO SUBCONSULTA*/
SELECT pr_descrip,COUNT(*)
FROM productos
WHERE pr_codigo IN (SELECT pr_codigo
FROM detalle
WHERE (fv_tipo and fv_numero)IN(SELECT fv_tipo,fv_numero
FROM factvent
WHERE month(fv_fecha)=month(getdate()) and
year(fv_fecha)=year(getdate())
)
)
GROUP BY pr_descrip

/*linea 5 and,linea10 ')'*/

Guillermo dijo...

No te sale por que la consulta está mal realizada , como ya les había explicado, hay casos en los que conviene group by y no subconsulta y en otros casos pasa al revés. Concretamente acá es mucho mas sencillo a través de Group by. Porque? porque la relación entre factura y detalle esta dada por una clave compuesta por dos columnas y para poder hacerlo a través de subconsultas deberías concateneralas a las dos y esto a mi no me convence y sino otra opcion de subconsultas sería con referencia a la consulta externa y con el operador EXISTS. Tu error está en la parte:
(fv_tipo and fv_numero)IN.....