USO DEL SUM Combinado Con Case
USO DEL SUM Combinado Con Case
USO DEL SUM Combinado Con Case
)
Resolucin del Ejercicio 7, ejercitario de Funciones de Grupo y Subconsultas:
Para tener una idea de movimientos, se desea conocer el volumen (cantidad) de ventas por mes que se hicieron por
cada artculo durante el ao 2012. Debe listar tambin los artculos que no tuvieron movimiento.
Anlisis y Resolucin
-
La cantidad de artculos vendidos se encuentra en el campo cantidad, de la tabla de detalles. Tomemos como
ejemplo el artculo 634817, Almohada Plumi 50x70 Altenburg.
Para entender mejor como funciona esta consulta, realicemos la insercin de dos registros ms con ventas de
ese artculo:
insert into b_detalle_ventas values (1,634817,3,6,63000);
insert into b_detalle_ventas values (2,634817,4,11,62727);
commit;
Analicemos ahora cada lnea del detalle. Si el mes de la venta es Enero, entonces devolvemos la cantidad
vendida, y si no, devolvemos 0 y as con todos los meses.
Podemos utilizar tanto CASE como DECODE:
--con CASE
Select ar.id,
ar.nombre Nombre_articulo,
case when(extract (month from ve.fecha))=1 then
case when(extract (month from ve.fecha))=2 then
from b_articulos ar
left join b_detalle_ventas dv on dv.id_articulo =
join b_ventas ve on ve.id=dv.id_venta and extract
where id_articulo=634817
;
--con DECODE
Select ar.id,
ar.nombre Nombre_articulo,
decode(extract (month from ve.fecha),1,dv.cantidad,0) enero,
decode(extract (month from ve.fecha),2,dv.cantidad,0) febrero
from b_articulos ar
left join b_detalle_ventas dv on dv.id_articulo = ar.id
join b_ventas ve on ve.id=dv.id_venta and extract (year from ve.fecha)='2011'
where id_articulo=634817
;
Con los datos que tenemos, vamos a ver que se devuelve una lnea por cada venta realizada, con los datos en
la columna del mes correspondiente:
En Febrero, se vendieron 10 unidades del artculo en una lnea del detalle y en otra, 4. Para agrupar todas las
ventas de ese artculo por mes en una sola linea, agregaremos un SUM:
Select ar.id,
ar.nombre Nombre_articulo,
sum(case when(extract (month from ve.fecha))=1 then dv.cantidad else 0 end) enero,
sum(case when(extract (month from ve.fecha))=2 then dv.cantidad else 0 end) febrero
from b_articulos ar
left join b_detalle_ventas dv on dv.id_articulo = ar.id
inner join b_ventas ve on ve.id=dv.id_venta
and extract (year from ve.fecha)='2011'
where id_articulo=634817
group by ar.id, ar.nombre ;