我有两列带分隔符的数据,我想将每个数据项分成几行。在下面的起始表中,分隔的数据在 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,但是我无法在两列上使用它。我应该使用另一种方法吗?预先谢谢你。
答案 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的最新版本中可用。在较旧的版本中,您可以使用自己的拆分功能,该功能可以在网上轻松找到。