在 SSIS/SQL 中的列数据类型上透视 Table
Pivot Table on Column Datatype in SSIS/SQL
我受命改造以下table:
+---------------+----------+---------+-------------+-----+-------------+--------+
| AnnualRevenue | City | Company | CreatedDate | Id | IsConverted | UserId |
+---------------+----------+---------+-------------+-----+-------------+--------+
| NULL | New York | ABC | 1/03/2015 | 123 | 0 | A1 |
| 200 | NULL | DEF | 2/03/2016 | 456 | 1 | A1 |
+---------------+----------+---------+-------------+-----+-------------+--------+
在 SQL 查询或 SSIS 中:
+-----+---------------+----------+-----------+------+------+--------+
| Id | name | nvarchar | date | int | bit | UserId |
+-----+---------------+----------+-----------+------+------+--------+
| 123 | AnnualRevenue | NULL | NULL | NULL | NULL | A1 |
| 123 | City | New York | NULL | NULL | NULL | A1 |
| 123 | Company | ABC | NULL | NULL | NULL | A1 |
| 123 | CreatedDate | NULL | 1/03/2015 | NULL | NULL | A1 |
| 123 | IsConverted | NULL | NULL | NULL | 0 | A1 |
| 456 | AnnualRevenue | NULL | NULL | 200 | | A1 |
| 456 | City | NULL | NULL | NULL | NULL | A1 |
| 456 | Company | DEF | NULL | NULL | NULL | A1 |
| 456 | CreatedDate | NULL | 2/03/2016 | NULL | NULL | A1 |
| 456 | IsConverted | NULL | NULL | NULL | 1 | A1 |
+-----+---------------+----------+-----------+------+------+--------+
我尝试在线研究并在 SSIS 中找到了 PIVOT 转换,但我以前从未使用过它。我无法弄清楚如何使用它来达到预期的结果。谁能指出我正确的方向?
此选项将动态地将您的数据和 link 数据类型转换为信息架构。
我应该注意,XML 字段名称 ID 和 UserId 区分大小写
例子
Select A.ID
,A.Name
,[nvarchar] = case when data_type='nvarchar' then value end
,[date] = case when data_type='date' then value end
,[int] = case when data_type='int' then value end
,[bit] = case when data_type='bit' then value end
,A.UserID
From (
Select C.*
From YourTable A
Cross Apply (Select XMLData = cast((Select A.* For XML Raw) as xml)) B
Cross Apply (
Select Id = r.value('@Id','int')
,UserID = r.value('@UserId','varchar(25)')
,Name = attr.value('local-name(.)','nvarchar(100)')
,Value = attr.value('.','nvarchar(max)')
From B.XMLData.nodes('/row') as A(r)
Cross Apply A.r.nodes('./@*') AS B(attr)
Where attr.value('local-name(.)','varchar(100)') not in ('Id','UserId')
) C
) A
Join (Select Column_Name,Data_Type From INFORMATION_SCHEMA.COLUMNS Where Table_Name='YourTable') B on B.Column_Name=A.Name
Returns
我受命改造以下table:
+---------------+----------+---------+-------------+-----+-------------+--------+
| AnnualRevenue | City | Company | CreatedDate | Id | IsConverted | UserId |
+---------------+----------+---------+-------------+-----+-------------+--------+
| NULL | New York | ABC | 1/03/2015 | 123 | 0 | A1 |
| 200 | NULL | DEF | 2/03/2016 | 456 | 1 | A1 |
+---------------+----------+---------+-------------+-----+-------------+--------+
在 SQL 查询或 SSIS 中:
+-----+---------------+----------+-----------+------+------+--------+
| Id | name | nvarchar | date | int | bit | UserId |
+-----+---------------+----------+-----------+------+------+--------+
| 123 | AnnualRevenue | NULL | NULL | NULL | NULL | A1 |
| 123 | City | New York | NULL | NULL | NULL | A1 |
| 123 | Company | ABC | NULL | NULL | NULL | A1 |
| 123 | CreatedDate | NULL | 1/03/2015 | NULL | NULL | A1 |
| 123 | IsConverted | NULL | NULL | NULL | 0 | A1 |
| 456 | AnnualRevenue | NULL | NULL | 200 | | A1 |
| 456 | City | NULL | NULL | NULL | NULL | A1 |
| 456 | Company | DEF | NULL | NULL | NULL | A1 |
| 456 | CreatedDate | NULL | 2/03/2016 | NULL | NULL | A1 |
| 456 | IsConverted | NULL | NULL | NULL | 1 | A1 |
+-----+---------------+----------+-----------+------+------+--------+
我尝试在线研究并在 SSIS 中找到了 PIVOT 转换,但我以前从未使用过它。我无法弄清楚如何使用它来达到预期的结果。谁能指出我正确的方向?
此选项将动态地将您的数据和 link 数据类型转换为信息架构。
我应该注意,XML 字段名称 ID 和 UserId 区分大小写
例子
Select A.ID
,A.Name
,[nvarchar] = case when data_type='nvarchar' then value end
,[date] = case when data_type='date' then value end
,[int] = case when data_type='int' then value end
,[bit] = case when data_type='bit' then value end
,A.UserID
From (
Select C.*
From YourTable A
Cross Apply (Select XMLData = cast((Select A.* For XML Raw) as xml)) B
Cross Apply (
Select Id = r.value('@Id','int')
,UserID = r.value('@UserId','varchar(25)')
,Name = attr.value('local-name(.)','nvarchar(100)')
,Value = attr.value('.','nvarchar(max)')
From B.XMLData.nodes('/row') as A(r)
Cross Apply A.r.nodes('./@*') AS B(attr)
Where attr.value('local-name(.)','varchar(100)') not in ('Id','UserId')
) C
) A
Join (Select Column_Name,Data_Type From INFORMATION_SCHEMA.COLUMNS Where Table_Name='YourTable') B on B.Column_Name=A.Name
Returns