sql-server - 我可以从具有不同数据类型的键值表创建动态数据透视查询吗?

标签 sql-server pivot key-value dynamic-sql

我有一个键值对表。我使用动态 sql 创建了一个脚本,可以正确旋转表。但是,键具有不同的数据类型。有没有办法在枢轴期间或之后动态地转换按键?我可以将每个键的数据类型放在同一个键值对表中,或者放在可通过键链接的单独表中。

使用动态 SQL 是因为我并不总是知道列。总会有一种数据类型。

起始表的示例:

sampleid     key   value    datatype
------------------------------------
1001        Name   Andrew    varchar(50)
1001        Date   20150129  datetime
1002        Name   Anna      varchar(50)
1002        Date   20150129  datetime

最终结果如下,名称为 nvarchar,日期为 datetime: 该脚本是一个存储过程,它将其创建到 View 中。该 View 是通过 SAS 和 Olive 等外部应用程序访问的,它们从 View 中获取数据类型。当然这并不理想,但这是我一直在尝试的任务!

sampleid  name      date
-----------------------------
1001     Andrew    20150129
1002     Anna      20150129

最佳答案

您可以使用动态 SQL 来完成此操作,只需将两个单独的“新列”列表创建为字符串即可。第一个列表将包含要转换为数据类型的列名称,第二个列表将用于 PIVOT 函数。

代码是:

DECLARE 
    @cols AS NVARCHAR(MAX),
    @colsConversion AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

-- get the list of [key] items for the columns used in the PIVOT
select @cols 
  = STUFF((SELECT ', ' + QUOTENAME([key])
            from yourtable
            group by [key], datatype           
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

-- get the list of columns for the final select
-- include a conversion of the columns into the correct datatype
select @colsConversion 
  = STUFF((SELECT ', cast(' + QUOTENAME([key]) +' as '+ datatype+') as ' + QUOTENAME([key])
            from yourtable
            group by [key], datatype           
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

-- the converted columns go in the final select list 
-- while the other @cols are used inside the PIVOT
set @query = 'SELECT sampleid, ' + @colsConversion + ' 
            from 
            (
              select sampleid, [key], value
              from yourtable
            ) x
            pivot 
            (
               max(value)
               for [key] in (' + @cols + ')
            ) p; '

exec sp_executesql @query;

参见SQL Fiddle with Demo

关于sql-server - 我可以从具有不同数据类型的键值表创建动态数据透视查询吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28463517/

相关文章:

php - mssql_connect 不会连接同一 SQL Server 上的不同数据库

sql-server - 存储过程 (SQL) 中的计算

sql-server - SQL 到 Linq 表达式?

python - 使用数据透视表 pandas 进行排序

JavaFx 以鼠标为中心缩放

ios - 如何创建一个包含 key ==> Value 的 .Plist?

php - 显示所有用户中答案选择的百分比

SQLITE 将大量行转换为列

javascript - 为当前键和值创建一个键值对

jquery - 需要将json键值对转换为标准数组