-
Cómo pivotar una consulta en Oracle
-
Una consulta de pivote en Oracle está diseñado para convertir columnas a filas y viceversa. Significa cambiar el énfasis de los datos a partir de una salida columnar a una salida basada en filas, por lo general un resumen de los datos como se ve en el siguiente ejemplo, que muestra las ciudades y los nombres de un conjunto de personas:Nombre de la ciudad
New York Rao
New York Miller
New York Smith
Nueva York Sastre
California Zettinger
Carburos de California
California Dillon
Tejas Ramírez
Tejas Martin
Tejas rey
En consulta pivotado, la salida podría ser:
Nombre (s) de la ciudad
Nueva York Rao, Miller, Smith, Sastre
California Zettinger, Carburos, Dillon
Tejas Ramírez, Martín, el rey
Instrucciones
1 Crear una tabla de prueba y poner toda la información en una tabla que contiene el formato original de la siguiente manera en el "SQL>" del sistema:
Create table (
statename VARCHAR2 (100),
VARCHAR2 apellido (20)
)
/
2 Insertar los datos en la nueva tabla "estados", de manera que se pueda extraer en forma de pivote:
INSERT INTO establece VALUES ( 'Nueva York', 'Rao');
INSERT INTO establece VALUES ( 'Nueva York', 'Miller');
INSERT INTO establece VALUES ( 'Nueva York', 'Smith');
INSERT INTO establece VALUES ( 'Nueva York', 'Sastre');
INSERT INTO establece VALUES ( 'California', 'Zettinger');
INSERT INTO establece VALUES ( 'California', 'Carburos');
INSERT INTO establece VALUES ( 'California', 'Dillon');
INSERT INTO Unidos valora ( 'Tejas', 'Ramírez');
INSERT INTO establece VALUES ( 'Tejas', 'Martin');
INSERT INTO establece VALUES ( 'Tejas', 'King');
3 Seleccionar todos los datos de la nueva tabla para ver cómo se ve en la actualidad:
Seleccionar * de los estados;
Debe mostrar una salida similar a la siguiente:
Nombre de la ciudad
New York RaoNew York Miller
New York Smith
Nueva York Sastre
California Zettinger
Carburos de California
California Dillon
Tejas Ramírez
Tejas Martin
Tejas rey
4 Pivote la consulta utilizando la siguiente técnica:
a.statename SELECT,
- Comprobar el número de fila para cada nombre y usar el nombre resultante.
MAX(DECODE(ar, 1,a.surname)) ||
MAX (DECODE (ar, 2, ',' || a.surname)) ||
MAX (DECODE (ar, 3, ',' || a.surname)) ||
MAX (DECODE (ar, 4, ',' || a.surname)) ||
MAX (DECODE (ar, 5, ',' || a.surname)) ||
MAX (DECODE (ar, 6 ',' || a.surname)) ||
MAX (DECODE (ar, 7 ',' || a.surname)) ||
MAX (DECODE (ar, 8 ',' || a.surname)) ||
MAX (DECODE (ar, 9 ',' || a.surname)) ||
MAX (recepción (ar, 10, ',' a.surname) || nombres)
FROM (SELECT states.statename,
states.surname,
NUMERO DE FILA()
- De tabiques mediante agrupar a los resultados por Statename, a diferencia de
- Agrupándose los resultados de forma ...
OVER (PARTITION BY states.statename
ORDER BY NULL) r
De los Estados de) una
GRUPO POR a.statename
ORDER BY a.statename
/
Esto puede parecer complejo al principio, pero la idea es que se identifica cada estado y el nombre y agrupados en líneas individuales (con la '||') en el nombre agrupados para el estado eash en una fila. El resultado es una consulta pivotada.
Consejos y advertencias
- Algunos índices llevará a cabo escaneos completos de tabla causando un rendimiento lento, a menos que una cláusula de "donde" se utiliza en las instrucciones de selección. Vale la pena conocer cómo funcionan los índices y el uso de "explicar los planes" para ver lo que el optimizador está haciendo en la práctica.