UNION COLUMNAS NULL
Publicado por gabrieldr (3 intervenciones) el 25/09/2010 06:27:02
Hola, como podria hacer una consulta de union en donde las filas de las ventas de ciertos almacenes se coloquen como columnas y en estas como totales.
ejemplo:
Almacen | Fecha | Producto | Venta
A1 01/ene/2010 P001 1
A1 01/ene/2010 P001 1
A2 02/ene/2010 P001 1
A2 02/ene/2010 P001 1
A3 02/ene/2010 P002 1
.....
A3 28/mar/2010 P010 1
A3 28/mar2010 P001 1
A2 28/mar2010 P015 1
A2 29/mar2010 P015 1
A1 30/mar2010 P002 1
En esta tabla se guardan todas las ventas de N productos (p001, p002, p003, .. p100, etc)
los cuales se pueden vender en diferentes almacenes (A1,A2,A3... A10) es decir posiblemente en el A1 se vendieron 2 el dia 01 de enero de P001, y 2 en el almacen del mismo producto.. etc.
La idea es definir cuantos se vendieron en cada mes, por almacen y por producto.
algo asi: ¿Como se puede hacer usando SQls simples?
Producto | Almacen | enero | febrero | marzo
P001 A1 2 0 1
P001 A2 1 0 1
P001 A3 1 0 0
P002 A1 1 1 2
P002 A3 0 0 1
P010 A3 1 1 1
P015 A2 2 1 0
Hemos intentado hacerlo usando unions pero creo que no era la forma.
Select
ventas.producto,
ventas.almacen,
count(ventas.ventas) as Enero,
null as Febrero,
null as Marzo
where
to_char(fecha 'YYYY') * 100 + to_char(fecha, 'MM') = 201001
group by
to_char(fecha 'YYYY') * 100 + to_char(fecha, 'MM') ,
ventas.producto,
ventas.almacen
union
Select
ventas.producto,
ventas.almacen,
null as Enero,
count(ventas.ventas) as Febrero,
null as Marzo
where
to_char(fecha 'YYYY') * 100 + to_char(fecha, 'MM') = 201002
group by
to_char(fecha 'YYYY') * 100 + to_char(fecha, 'MM') ,
ventas.producto,
ventas.almacen
union
Select
ventas.producto,
ventas.almacen,
null as Enero,
null as Febrero,
count(ventas.ventas) as Marzo
where
to_char(fecha 'YYYY') * 100 + to_char(fecha, 'MM') = 201001
group by
to_char(fecha 'YYYY') * 100 + to_char(fecha, 'MM') ,
ventas.producto,
ventas.almacen
Esto sorprendentemente funciona. pero con un pequeño detalle.
nos arroja las columnas es "escalera"
ejemplo:
Producto | Almacen | enero | febrero | marzo
P001 A1 2
P001 A2 1
P001 A3 1
P002 A1 1
P002 A3 0
P010 A3 1
P015 A2 2
P001 A1 0
P001 A2 0
P001 A3 0
P002 A1 1
P002 A3 0
P010 A3 1
P015 A2 1
P001 A1 1
P001 A2 1
P001 A3 0
P002 A1 2
P002 A3 1
P010 A3 1
P015 A2 0
ejemplo:
Almacen | Fecha | Producto | Venta
A1 01/ene/2010 P001 1
A1 01/ene/2010 P001 1
A2 02/ene/2010 P001 1
A2 02/ene/2010 P001 1
A3 02/ene/2010 P002 1
.....
A3 28/mar/2010 P010 1
A3 28/mar2010 P001 1
A2 28/mar2010 P015 1
A2 29/mar2010 P015 1
A1 30/mar2010 P002 1
En esta tabla se guardan todas las ventas de N productos (p001, p002, p003, .. p100, etc)
los cuales se pueden vender en diferentes almacenes (A1,A2,A3... A10) es decir posiblemente en el A1 se vendieron 2 el dia 01 de enero de P001, y 2 en el almacen del mismo producto.. etc.
La idea es definir cuantos se vendieron en cada mes, por almacen y por producto.
algo asi: ¿Como se puede hacer usando SQls simples?
Producto | Almacen | enero | febrero | marzo
P001 A1 2 0 1
P001 A2 1 0 1
P001 A3 1 0 0
P002 A1 1 1 2
P002 A3 0 0 1
P010 A3 1 1 1
P015 A2 2 1 0
Hemos intentado hacerlo usando unions pero creo que no era la forma.
Select
ventas.producto,
ventas.almacen,
count(ventas.ventas) as Enero,
null as Febrero,
null as Marzo
where
to_char(fecha 'YYYY') * 100 + to_char(fecha, 'MM') = 201001
group by
to_char(fecha 'YYYY') * 100 + to_char(fecha, 'MM') ,
ventas.producto,
ventas.almacen
union
Select
ventas.producto,
ventas.almacen,
null as Enero,
count(ventas.ventas) as Febrero,
null as Marzo
where
to_char(fecha 'YYYY') * 100 + to_char(fecha, 'MM') = 201002
group by
to_char(fecha 'YYYY') * 100 + to_char(fecha, 'MM') ,
ventas.producto,
ventas.almacen
union
Select
ventas.producto,
ventas.almacen,
null as Enero,
null as Febrero,
count(ventas.ventas) as Marzo
where
to_char(fecha 'YYYY') * 100 + to_char(fecha, 'MM') = 201001
group by
to_char(fecha 'YYYY') * 100 + to_char(fecha, 'MM') ,
ventas.producto,
ventas.almacen
Esto sorprendentemente funciona. pero con un pequeño detalle.
nos arroja las columnas es "escalera"
ejemplo:
Producto | Almacen | enero | febrero | marzo
P001 A1 2
P001 A2 1
P001 A3 1
P002 A1 1
P002 A3 0
P010 A3 1
P015 A2 2
P001 A1 0
P001 A2 0
P001 A3 0
P002 A1 1
P002 A3 0
P010 A3 1
P015 A2 1
P001 A1 1
P001 A2 1
P001 A3 0
P002 A1 2
P002 A3 1
P010 A3 1
P015 A2 0
Valora esta pregunta


0