texto - Cómo dividir una sola fila en varias filas en SQL
separar texto en columnas oracle (1)
Tengo una tabla que se ve de la siguiente manera ... tiene múltiples columnas para diferentes latencias
Date API Latency1_Avg Latency1_Min Latency1_Max Latency2_Avg Latency2_Min Latency2_Max
---- --- ------------ ------------ ------------ ------------ ------------ ------------
7/26/13 Foo 12 35 45 453 433 435
7/26/13 Bar 33 33 33 234 243 234
Quiero dar salida a una tabla que divide cada fila en varias filas de la siguiente manera
Date API Latency Aggregation Value
---- ---- ------- ----------- -----
7/26/13 Foo Latency1 Avg 12
7/26/13 Foo Latency1 Min 35
7/26/13 Foo Latency1 Max 45
7/26/13 Foo Latency2 Avg 453
7/26/13 Foo Latency2 Min 433
7/26/13 Foo Latency2 Max 435
.....
En este momento, lo que estoy haciendo es esto
SELECT
Date,
API,
"Latency1" AS Latency,
"Avg" AS Calculation,
Latency1_Avg AS Value
FROM Table UNION ALL
SELECT
Date,
API,
"Latency1" AS Latency,
"Min" AS Calculation,
Latency1_Min AS Value
FROM Table UNION ALL
SELECT
Date,
API,
"Latency1" AS Latency,
"Max" AS Calculation,
Latency1_Max AS Value
FROM Table UNION ALL
.... pronto
Esto es muy ineficiente en cuanto al rendimiento, porque estoy haciendo un escaneo de tabla para cada una de las declaraciones seleccionadas ... cuando esta tabla es enorme, lleva mucho tiempo consultar ...
¿Hay una forma mejor n más rápida para hacer esto? Puede estar usando una función personalizada?
Puedes usar CROSS APPLY
:
SELECT [Date]
, API
, LEFT(col,CHARINDEX(''_'',col)-1)''Latency''
, RIGHT(col,CHARINDEX(''_'',REVERSE(col))-1)''Aggregation''
, Value
FROM
(
SELECT [Date],API,col,value
FROM YourTable
CROSS APPLY
(
VALUES (''Latency1_Avg'', [Latency1_Avg]),(''Latency1_Min'', [Latency1_Min]),(''Latency1_Max'', [Latency1_Max]),(''Latency2_Avg'', [Latency2_Avg]),(''Latency2_Min'', [Latency2_Min]),(''Latency2_Max'', [Latency2_Max])
) C (COL, VALUE)
) SRC
Demostración: SQL Fiddle