Documente Academic
Documente Profesional
Documente Cultură
1
Universidad Carlos III de Madrid Elena Castro, Sonia Garca y Harith Al-Jumaily
A la tabla VENTAS_H debemos aadirle los registros de totales, nos faltan 4x2=6 subtotales y el
gran total, es decir 7 registros
2
Universidad Carlos III de Madrid Elena Castro, Sonia Garca y Harith Al-Jumaily
Para evitar hacer esto, Oracle dispone de unas extensiones de SQL para agregaciones en
DataWarehouses, por ejemplo CUBE:
ROLLUP, se usa ms para navegar en las jerarquas aunque tambin puede usarse con
dimensiones, por ejemplo:
3
Universidad Carlos III de Madrid Elena Castro, Sonia Garca y Harith Al-Jumaily
Sin embargo faltan dos filas cules? Los subtotales de producto. Nos da los agregados de
tienda para cada una de las siguientes columnas, pero nunca nos dar los agregados del resto
de dimensiones.
Nos falta los subtotales por tienda... No es un cubo completo, es muy til para las jerarquas.
4
Universidad Carlos III de Madrid Elena Castro, Sonia Garca y Harith Al-Jumaily
Se puede hacer parcial (ver que falta el total por pas), por ejemplo:
Ahora surge el problema de determinar cuales de los registros son subtotales o totales, y cual
es el nivel exacto de agregacin. Si queremos calcular un % sobre el total, debemos ser
capaces de encontrar el total con facilidad. Adems qu ocurre si uno de los registros tiene
valores nulos en su dimensin cmo lo distinguimos de un subtotal?
Funciones GROUPING
5
Universidad Carlos III de Madrid Elena Castro, Sonia Garca y Harith Al-Jumaily
Podemos ver que los registros que tienen 1 significa que est totalizada esa dimensin y los
que tienen 0 no. As, el registro con 1 1 significar el gran total, y un 1 0 un subtotal, y las 0 0
sern las celdas del cubo.
As podramos escribir una select que basndose en estos valores completara los nulos:
Tambin es muy til al combinarla con la clusula HAVING para obtener solo un tipo de
resultado. Por ejemplo totales y subtotales:
6
Universidad Carlos III de Madrid Elena Castro, Sonia Garca y Harith Al-Jumaily
Con esta misma filosofa est el GROUPING_ID y nace con el objeto de reducir el espacio de
almacenamiento (1 columna por dimensin frente a una sola por conjunto de dimensiones). Se
calcula construyendo un nmero en binario siguiendo el orden de las dimensiones marcadas.
/* 17 DE FEBRERO */
GROUPING SETS
Permiten decidir exactamente las dimensiones que entran en juego sin computar el cubo
entero.
CUBE(a, b, c)
=
GROUPING SETS ((a, b, c), (a, b), (a, c), (b, c), (a), (b), (c), ())
ROLLUP(a, b, c)
=
GROUPING SETS ((a, b, c), (a, b), ())
Mostrar todas las combinaciones TiendaXProducto 8, y los totales por tienda 4, es decir 12
registros.
7
Universidad Carlos III de Madrid Elena Castro, Sonia Garca y Harith Al-Jumaily
Veamos unas de las ms usadas Ranking, tenemos dos funciones RANK y DENSE_RANK, son
muy parecidas, la diferencia es, si tenemos los siguientes datos: 100,100,50,20
Dense Rank dira que en la primera posicin estn 100 y 100, en la segunda 50 y en la cuarta
20
Rank dira que en la primera posicin estn 100 y 100, en la tercera 50 y en la cuarta 20
Por ejemplo:
SELECT TIENDA, PRODUCTO, SUM(VENTAS), DENSE_RANK() OVER (ORDER BY SUM(VENTAS)
DESC) D_RANK, RANK() OVER (ORDER BY SUM(VENTAS) DESC) RANK
FROM VENTAS_H
GROUP BY TIENDA, PRODUCTO;
8
Universidad Carlos III de Madrid Elena Castro, Sonia Garca y Harith Al-Jumaily
9
Universidad Carlos III de Madrid Elena Castro, Sonia Garca y Harith Al-Jumaily
DECLARE
f DATE;
BEGIN
FOR i IN 1..500 LOOP
f:=SYSDATE-i;
INSERT INTO TIEMPO_D VALUES
(
TO_CHAR(f,'YYYY')||TO_CHAR(f,'MM')||TO_CHAR(f,'DD'),
TRUNC(f),
TO_CHAR(f,'DAY'),
TO_NUMBER(TO_CHAR(f,'W')), /*semana del mes*/
TO_NUMBER(TO_CHAR(f,'MM')),
TO_CHAR(f,'MONTH'),
TO_NUMBER(TO_CHAR(f,'Q')),
'Q'||TO_CHAR(f,'Q'),
TO_NUMBER(TO_CHAR(f,'YYYY'))
);
10
Universidad Carlos III de Madrid Elena Castro, Sonia Garca y Harith Al-Jumaily
END LOOP;
END;
DECLARE
f DATE;
c VARCHAR(8);
BEGIN
FOR i IN 2..500 LOOP
f:=SYSDATE-i;
c:=TO_CHAR(f,'YYYY')||TO_CHAR(f,'MM')||TO_CHAR(f,'DD');
INSERT INTO VENTAS_H VALUES ('ALCORCON', 'MESAS
JARDIN',dbms_random.value(0,200),c);
INSERT INTO VENTAS_H VALUES ('ALCORCON', 'MUEBLES BAO',
dbms_random.value(0,200),c);
INSERT INTO VENTAS_H VALUES ('LAS ROZAS', 'MESAS JARDIN',
dbms_random.value(0,200),c);
INSERT INTO VENTAS_H VALUES ('LAS ROZAS', 'MUEBLES BAO',
dbms_random.value(0,200),c);
INSERT INTO VENTAS_H VALUES ('MAJADAHONDA', 'MESAS JARDIN',
dbms_random.value(0,200),c);
INSERT INTO VENTAS_H VALUES ('MAJADAHONDA', 'MUEBLES BAO',
dbms_random.value(0,200),c);
INSERT INTO VENTAS_H VALUES ('RIVAS', 'MESAS JARDIN', dbms_random.value(0,200),c);
INSERT INTO VENTAS_H VALUES ('RIVAS', 'MUEBLES BAO', dbms_random.value(0,200),c);
END LOOP;
END;
A partir de aqu los alumnos pueden practicar del mismo modo que en el ejercicio anterior pero
con un modelo ms complejo y con ms datos.
11