SQL Server将列转换为使用ID作为列名称的列

时间:2017-05-30 12:36:39

标签: sql-server sql-server-2016

我有一个包含以下字段的大文件:

表1:

+---------+--------+-----------+
| User_Id | Key_Id | Value     | 
+---------+--------+-----------+
| 100     | 74     | 37        |
| 100     | 65     | Male      |
| 100     | 279    | G235467   |
+---------+--------+-----------+

我有另一个文件告诉每个'Key_Id'被调用的内容(它们是列名),例如。

表2:

+--------+------------------+
| Key_Id | Key              |
+--------+------------------+
| 65     | Gender           |
| 66     | Height           |
| 74     | Age              |
| 279    | ReferenceNo      |

我想使用在表2的Key列中找到的Key_Id名称创建一个表,将表1中的所有值转换为表2,但也包括表1中的User_Id,因为这与个人有关。 / p>

PS。表2有近300个需要转换为单个字段的密钥

所以最终我想要一个看起来像这样的表:

+---------+---------+--------+-------+--------------+--------+
| User_Id | Gender  | Height | Age   | ReferenceNo  |  etc   |
+---------+---------+--------+-------+--------------+--------+
| 100     | Male    |        | 37    | G235467      |        |

这样每个User_Id都是一行,并且所有Keys都是具有各自值的列

3 个答案:

答案 0 :(得分:0)

您可以使用以下角色:

Select * from (
    Select u.UserId, k.[key], u.[Value] from table1 u
       join table2 k on u.keyid = k.keyid   ) a
pivot ( max([Value]) for [key] in ([Gender], [Height], [Age], [ReferenceNo]) ) p

对于动态键列表,您可以使用动态sql,如下所示:

Declare @cols1 varchar(max)
Declare @query nvarchar(max)

Select @cols1 = stuff((select ','+QuoteName([Key]) from table2 group by [Key] for xml path('')),1,1,'')

Set @Query = 'Select * from (
    Select u.UserId, k.[key], u.[Value] from table1 u
       join table2 k on u.keyid = k.keyid   ) a 
pivot ( max([Value]) for [key] in (' + @cols1 + ') ) p '

Select @Query  --Check the generated query and execute by uncommenting below query
--exec sp_executesql @Query 

答案 1 :(得分:0)

你需要得到一个以逗号分隔的列表,列出要在T-SQL中的PIVOT / UNPIVOT运算符中使用的300个键名,如下所述

https://docs.microsoft.com/en-us/sql/t-sql/queries/from-using-pivot-and-unpivot

答案 2 :(得分:0)

您可以使用动态SQL查询,如下所示。

<强>查询

declare @sql as varchar(max);

select @sql = 'select t1.[User_Id], ' + stuff((select +
    ', max(case t2.[Key_Id] when ' + cast([Key_Id] as varchar(100)) + 
    ' then t1.[Value] end) as [' + [Key] + '] '
    from Table2 
    for xml path('')
), 1, 2, '') + 
'from Table1 t1 left join Table2 t2 on t1.[Key_Id] = t2.[Key_Id] group by t1.[User_Id];'

exec(@sql);

<强> Find a demo here