我有一个表格如下所示..它有多列用于不同的延迟
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
....等等
这是非常低效的性能,因为我正在为每个select语句进行表扫描......当这个表很大时,查询需要很长时间......
有更好的更快的方法吗?可能正在使用自定义功能?
答案 0 :(得分: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