Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在TSQL中拆分数据_Sql_Sql Server_Tsql_Unpivot - Fatal编程技术网

如何在TSQL中拆分数据

如何在TSQL中拆分数据,sql,sql-server,tsql,unpivot,Sql,Sql Server,Tsql,Unpivot,需要一些关于如何分割数据的帮助吗 当前的数据如下所示 ╔═════════════════════════════════════════════╗ ║ Name Data1 Data2 Data3 Field1 field2 Field3 ║ ╠═════════════════════════════════════════════╣ ║ a 1 2 3 x y z ║ ╚══════════════════════════════

需要一些关于如何分割数据的帮助吗

当前的数据如下所示

╔═════════════════════════════════════════════╗
║ Name Data1 Data2 Data3 Field1 field2 Field3 ║
╠═════════════════════════════════════════════╣
║ a     1      2     3     x      y      z    ║
╚═════════════════════════════════════════════╝
+-----------------+
| name data field |
+-----------------+
| a     1     x   |
| a     2     y   |
| a     3     z   |
+-----------------+
我需要分割数据,使其看起来像这样

╔═════════════════════════════════════════════╗
║ Name Data1 Data2 Data3 Field1 field2 Field3 ║
╠═════════════════════════════════════════════╣
║ a     1      2     3     x      y      z    ║
╚═════════════════════════════════════════════╝
+-----------------+
| name data field |
+-----------------+
| a     1     x   |
| a     2     y   |
| a     3     z   |
+-----------------+

有人能帮我做这件事吗?

有很多方法可以做到这一点(只需看看蓝脚的答案),但一个简单的方法是使用
UNION ALL

SELECT [Name], Data1 AS Data, Field1 AS Field
FROM YourTable
UNION ALL
SELECT [Name], Data2 AS Data, Field2 AS Field
FROM YourTable
UNION ALL
SELECT [Name], Data3 AS Data, Field3 AS Field
FROM YourTable

还有一个演示(由蓝脚提供)。

取决于您的SQL Server版本。从SQL Server 2008开始,您可以使用
交叉应用

SELECT t.name,
  x.Data,
  x.Field
FROM YourTable t
CROSS APPLY 
(
    VALUES
        (t.Data1, t.Field1),
        (t.Data2, t.Field2),
        (t.Data3, t.Field3)
) x (Data, Field);

这也可以使用SQL Server 2005+中的
UNPIVOT
PIVOT
函数来完成:

select name, data, field
from
(
  select name, left(col, len(col) -1) col, value,
    row_number() over(partition by left(col, len(col) -1) order by col) rn
  from
  (
    select name, 
      cast([Data1] as varchar(10)) Data1, 
      cast([Data2] as varchar(10)) Data2, 
      cast([Data3] as varchar(10)) Data3, 
      [Field1], [field2], [Field3]
    from yourtable
  ) src
  unpivot
  (
    value
    for col in ([Data1], [Data2], [Data3], 
                [Field1], [field2], [Field3])
  ) unpiv
) u
pivot
(
  max(value)
  for col in (data,field)
) piv

两者都给出了结果:

| NAME | DATA | FIELD |
-----------------------
|    a |    1 |     x |
|    a |    2 |     y |
|    a |    3 |     z |

此查询还将水平表转换为垂直表。如果你想让它保持并查询它,就把它变成一个视图。在2005年,使用
UNION ALL
可以实现同样的效果。我如何将交叉应用的结果转储到一个表中?@Greg你可以使用
SELECT-into-newtable
-看到这个演示--@ethrbunny在两个答案后问这个问题?