sql - SQL中如何将单行拆分为多行

标签 sql sql-server sql-server-2012 sql-function sqlperformance

我有一个如下所示的表格..它有多个列用于不同的延迟

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 语句进行表扫描......当这个表很大时,查询需要很长时间......

是否有更好更快的方法来做到这一点?可能正在使用自定义函数?

最佳答案

您可以使用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

关于sql - SQL中如何将单行拆分为多行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17887403/

相关文章:

sql - UDF 中的 COLLATE 未按预期工作

SQL查询以获取已注册英语或乌尔都语类(class)但未同时注册的学生

mysql - 引用 SQL DB 中的两个表

php - 我如何使用 php 从 sql 查询创建一个 csv 文件

sql - 如何在数据透视中为列提供自定义名称

sql - 创建非聚集列存储索引的存储过程

sql - dbvisualizer:在选择查询中设置最大行数

sql - 如何使用动态 SQL 生成列组?

SQL close close 随着时间的推移数据中的差距

sql-server - 将 XML 节点转换为 SQL Server 中的行