valores texto separar separados separada por partes hacer funciones extraer delimitada consultas comas coma columnas cadena agrupamiento agrupadas sql sql-server sql-server-2012 sql-function sqlperformance

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