sql-server - 动态 SQL Server Pivot (UNPIVOT) 列名到行值

标签 sql-server pivot

我正在使用 SQL Server。我有一个返回 1 行数据的查询。

SELECT *
FROM DBO.MY_TABLE
WHERE ID = 5

它看起来像这样:
ID    F_NAME    L_NAME    NUMBER
5     JOE       SCHMOE    1234567890

我需要一个对它们进行旋转的查询/过程。我需要结果看起来像这样:
ID        5
F_NAME    JOE
L_NAME    SCHMOE
NUMBER    1234567890

基本上,列名成为第一列的值,而行的值成为第二列的值。

诀窍是我并不总是确定会有多少列,可能有 2 或 20 列。它可以变化。

但是,只会有一行数据。

最佳答案

所以你有几个问题......第一个是这需要动态 sql,因为表和列是不知道提前的,所以你不能只使用简单的 unpivot。

这也意味着您必须从系统表中获取列名。

您的第二个问题是您的所有数据类型都是未知的,因此您必须将所有列转换为可以支持所有内容和任何长度的东西...... varchar(max)。

因此,考虑到这两个障碍,这里有一个解决方案:

declare @yourTable varchar(50)
declare @yourKeyField varchar(50)
declare @yourKey varchar(50)

set @yourTable = 'MyTable' /** change to tablename or pass as parameter */
set @yourKeyField = 'ID'   /** change to fieldname or pass as parameter */
set @yourKey = '5'         /** change to key value or pass as parameter */

declare @query nvarchar(max)  

select @query = COALESCE(@query+' union all ','') + 'select ''' + c.name + ''' as
[Column], Cast([' + c.name + '] AS VarChar(MAX)) as [Value] from ' + @yourTable + ' 
where ' + @yourKeyField + ' = ''' + @yourKey + '''' from syscolumns c 
    inner join sysobjects o on c.id = o.id and o.xtype = 'u'
    where o.name = @yourTable order by c.colid

exec sp_executesql @query /** execute query */

最后,我不能凭良心推荐一个使用动态 sql 的解决方案而不警告其中涉及的危险(从性能角度和注入(inject)的可能性)。如果您想增加对该主题的了解,请阅读这篇出色的文章。

http://www.sommarskog.se/dynamic_sql.html

关于sql-server - 动态 SQL Server Pivot (UNPIVOT) 列名到行值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8917108/

相关文章:

sql - 左连接位于左连接之上

sql - 如何在 SQL Server 中选择父行和子行

sql-server - 具有动态字段的 SQL Server Pivot

MySQL 数据透视表列数据作为行

sql - 基于一列对数据进行分组

sql-server - 如何使用无 DSN 连接在 Access 中创建直通查询?

sql-server - 在 MS SQL 中创建 "date updated"列?

python - 将 join 的两列合并为一列的结果

sql - TSQL Pivot 4 值列

MySQL:将另一个表中的2行合并为一个结果行