Oracle - UNION COLUMNAS NULL

   
Vista:

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
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:UNION COLUMNAS NULL

Publicado por Fernando (10 intervenciones) el 26/09/2010 01:41:50
No es necesario que hagas un UNION. Puedes hacerlo de la siguiente forma:

SQL> create table ventas
as select
trunc(dbms_random.value(1,5)) almacen,
sysdate - dbms_random.value(1,120) fecha,
trunc(dbms_random.value(1,4)) producto,
trunc(dbms_random.value(1,10)) venta
from dba_tables
/

Table created.

SQL> select almacen,
producto,
max( decode( mes, 5, ventas, null ) ) Mayo,
max( decode( mes, 6, ventas, null ) ) Junio,
max( decode( mes, 7, ventas, null ) ) Julio,
max( decode( mes, 8, ventas, null ) ) Agosto,
max( decode( mes, 9, ventas, null ) ) Setiembre
from
(select almacen, producto, to_char(fecha, 'MM') mes, sum(venta) ventas
from ventas
group by almacen, producto, to_char(fecha, 'MM'))
group by almacen, producto
/

ALMACEN PRODUCTO MAYO JUNIO JULIO AGOSTO SETIEMBRE
---------- ---------- ---------- ---------- ---------- ---------- ----------
4 1 16 325 257 288 218
2 1 11 268 347 319 270
2 3 29 267 300 280 241
1 2 23 269 283 270 188
4 2 44 358 267 323 225
3 1 49 414 246 320 228
1 3 36 227 316 321 157
1 1 29 206 246 316 304
2 2 25 360 316 334 216
3 3 21 208 315 302 249
4 3 42 315 402 313 295
3 2 46 323 279 305 176

12 rows selected.

SQL> drop table ventas
/
Table dropped.

Tienes que adaptarlo para incluir todos los meses del año.

Un saludo,
Fernando
http://comunidadoraclehispana.ning.com
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar