La forma más sencilla de pivotar una tabla es utilizar la función: DESCODIFICAR(). La función DECODE() es como una declaración if else. Compara la entrada con cada valor y produce una salida.
DECODIFICAR (entrada, valor1, retorno1, valor2, retorno2,…, predeterminado)
- valor de entrada: la “entrada” se compara con todos los “valores”.
- devolver: si entrada = valor, entonces “retorno” es la salida.
- predeterminado (opcional): si entrada! = todos los valores, entonces “predeterminado” es la salida.
Cuando sepamos cómo funciona DECODE(), será el momento de crear nuestra primera tabla dinámica.
Primera versión: tabla dinámica sin columna ni fila total
Con DECODE(), podemos trazar un pseudocódigo de una tabla dinámica para el propietario de la heladería. Cuando el “día de la semana” coincide con cada día de la semana, DECODE() devuelve los ingresos del día; si no coincide, se devuelve 0.
SELECT ice cream flavor,
SUM(DECODE(day of the week, 'Monday', revenue, 0)) AS MONDAY, SUM(DECODE(day of the week, 'Tuesday', revenue, 0)) AS TUESDAY,
SUM(DECODE(day of the week, 'Wednesday', revenue, 0)) AS WEDNESDAY,
SUM(DECODE(day of the week, 'Thursday', revenue, 0)) AS THURSDAY,
SUM(DECODE(day of the week, 'Friday', revenue, 0)) AS FRIDAY,
SUM(DECODE(day of the week, 'Saturday', revenue, 0)) AS SATURDAY,
SUM(DECODE(day of the week, 'Sunday', revenue, 0)) AS SUNDAY
FROM ice cream shop dataset
WHERE date between last Monday and last Sunday;
Segunda versión: tabla dinámica con columna y fila total
¡Gran trabajo! Ahora el dueño de la heladería quiere saber más sobre lo que pasó con las ventas de la semana pasada. Puede actualizar su tabla dinámica agregando una columna de total y una fila de total.
Esto podría lograrse utilizando el CONJUNTOS DE AGRUPACIÓN Expresión en una declaración GROUP BY. Una expresión GROUPING SETS define criterios para múltiples agregaciones GROUP BY.
CONJUNTOS DE AGRUPACIÓN (atributo1,…, ())
- atributo: un solo elemento o una lista de elementos para GROUP BY
- (): un grupo vacío, que se convertirá en la fila TOTAL de la tabla dinámica
SELECT NVL(ice cream flavor, 'TOTAL') "ICE CREAM FLAVOR",
SUM(DECODE(day of the week, 'Monday', revenue, 0)) AS MONDAY, SUM(DECODE(day of the week, 'Tuesday', revenue, 0)) AS TUESDAY,
SUM(DECODE(day of the week, 'Wednesday', revenue, 0)) AS WEDNESDAY,
SUM(DECODE(day of the week, 'Thursday', revenue, 0)) AS THURSDAY,
SUM(DECODE(day of the week, 'Friday', revenue, 0)) AS FRIDAY,
SUM(DECODE(day of the week, 'Saturday', revenue, 0)) AS SATURDAY,
SUM(DECODE(day of the week, 'Sunday', revenue, 0)) AS SUNDAY,
SUM(revenue) AS TOTAL
FROM ice cream shop dataset
WHERE date between last Monday and last Sunday
GROUP BY GROUPING SETS (ice cream flavor, ());
Nota: NVL() reemplaza la fila nula creada por () con ‘TOTAL’. Si no estás familiarizado con NVL()es simplemente una función para reemplazar valores nulos.
Otra forma de calcular la columna TOTAL es sumar todos los ingresos del LUNES al DOMINGO:
SUM(DECODE(day of the week, 'Monday', revenue, 0))
+ SUM(DECODE(day of the week, 'Tuesday', revenue, 0))
+ SUM(DECODE(day of the week, 'Wednesday', revenue, 0))
+ SUM(DECODE(day of the week, 'Thursday', revenue, 0))
+ SUM(DECODE(day of the week, 'Friday', revenue, 0))
+ SUM(DECODE(day of the week, 'Saturday', revenue, 0))
+ SUM(DECODE(day of the week, 'Sunday', revenue, 0)) AS TOTAL
Tercera versión: tabla dinámica con columna y fila total y otros totales
Supongamos que el propietario del helado quería una columna más en la tabla dinámica que usted proporcionó: el número total de compras de cada sabor de helado. ¡Ningún problema! ¡Puedes agregar otra columna “TOTAL” con el mismo concepto!
SELECT NVL(ice cream flavor, 'TOTAL') "ICE CREAM FLAVOR",
SUM(DECODE(day of the week, 'Monday', revenue, 0)) AS MONDAY, SUM(DECODE(day of the week, 'Tuesday', revenue, 0)) AS TUESDAY,
SUM(DECODE(day of the week, 'Wednesday', revenue, 0)) AS WEDNESDAY,
SUM(DECODE(day of the week, 'Thursday', revenue, 0)) AS THURSDAY,
SUM(DECODE(day of the week, 'Friday', revenue, 0)) AS FRIDAY,
SUM(DECODE(day of the week, 'Saturday', revenue, 0)) AS SATURDAY,
SUM(DECODE(day of the week, 'Sunday', revenue, 0)) AS SUNDAY,
SUM(revenue) AS TOTAL,
SUM(purchase ID) "OTHER TOTAL"
FROM ice cream shop dataset
WHERE date between last Monday and last Sunday
GROUP BY GROUPING SETS (ice cream flavor, ());