3

У меня есть таблица, которая выглядит, как follows..it имеет несколько столбцов для различных задержекКак разбить одну строки на несколько строк в SQL

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 

Я хочу вывод таблицы, которая делит каждую строку на несколько строк следующим

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 

.....

Прямо сейчас, что я делаю это

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 

.... так далее

Это очень неэффективная производительность мудрый, потому что я делаю сканирование таблицы для каждого из оператора выбора ... когда эта таблица огромна, то это занимает много времени, чтобы запрос ...

Есть ли лучший способ быстрее? Может использоваться пользовательская функция?

+0

таблица не индексируются, и я не админ для этого SQL-сервер, так что я не могу добавить индексы. Любая другая техника для ускорения запроса? так как производительность CROSS APPLY такая же, как UNION ALL, как указано ниже – user330612

ответ

6

Вы можете использовать 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 

Демо: SQL Fiddle

+0

Спасибо за ответы. Является ли использование PIVOT более совершенным, чем CROSS APPLY? http://msdn.microsoft.com/en-us/library/ms177410%28v=sql.105%29.aspx – user330612

+0

Я не уверен, как вы это сделаете, или если производительность будет иной. –

+0

Я только что изменил свой первоначальный запрос, который использовал UNION ALL для использования CROSS APPLY, но я не вижу разницы в производительности. Оба взяли почти 47 секунд на avg. Поэтому использование CROSS не дает мне преимуществ перед использованием UNIONALL несколько раз! любая другая идея? Моя таблица содержит 253730 строк и 47 столбцов, а итоговая таблица вывода содержит 3552220 строк. – user330612

Смежные вопросы