SQL Server-将定界的列数据透视成行

时间:2019-06-04 15:29:29

标签: sql sql-server

我有两列带分隔符的数据,我想将每个数据项分成几行。在下面的起始表中,分隔的数据在 DataPointA DataPointB 列中表示。另外,请注意,每个ID对于每个人都是唯一的标识符。起始表如下:

----------------------------------------------------------
|  ID   | FirstName | LastName | DataPointA | DataPointB |
----------------------------------------------------------
| A1234 | Bill      | Jones    | 1,3,7,8    | 1,4        |
| B5678 | Jane      | Smith    | 2,4,6,9    | 1,5        |
----------------------------------------------------------

我想采用逗号分隔的DataPoint列数据,并为每个DataPoint值创建一行,同时还要压缩为一个字段。因此最终结果将如下所示:

-------------------------------------------------------------
|  ID   | FirstName | LastName | DataPoint  | DataPointType |
-------------------------------------------------------------
| A1234 | Bill      | Jones    | 1          | A             |
| A1234 | Bill      | Jones    | 3          | A             |
| A1234 | Bill      | Jones    | 7          | A             |
| A1234 | Bill      | Jones    | 8          | A             |
| A1234 | Bill      | Jones    | 1          | B             |
| A1234 | Bill      | Jones    | 4          | B             |
| B5678 | Jane      | Smith    | 2          | A             |
| B5678 | Jane      | Smith    | 4          | A             |
| B5678 | Jane      | Smith    | 6          | A             |
| B5678 | Jane      | Smith    | 9          | A             |
| B5678 | Jane      | Smith    | 1          | B             |
| B5678 | Jane      | Smith    | 5          | B             |
-------------------------------------------------------------

我的第一个直觉是使用UNPIVOT,但是我无法在两列上使用它。我应该使用另一种方法吗?预先谢谢你。

1 个答案:

答案 0 :(得分:2)

您不需要旋转。您需要字符串拆分:

split()

select t.ID, t.FirstName, t.LastName, v.* from t cross apply (select 'A' as DataPointType, a.value as DataPoint from string_split(t.DataPointA, ',') a union all select 'B' as DataPointType, b.value as DataPoint from string_split(t.DataPointB, ',') b ) ab; 仅在SQL Server的最新版本中可用。在较旧的版本中,您可以使用自己的拆分功能,该功能可以在网上轻松找到。