我可以从具有不同数据类型的键值 table 创建动态数据透视查询吗?
Can I create dynamic pivot query from key value table with different data types?
我有一个键值对table。我已经使用动态 sql 创建了一个脚本,可以正确地旋转 table。但是,键具有不同的数据类型。有没有办法在枢轴期间或之后动态地投射钥匙?对于每个键,我可以将数据类型放在相同的键值对 table 中,或者放在可通过键链接的单独 table 中。
使用动态 sql 是因为我并不总是知道这些列。总会有一种数据类型。
开头的例子table:
sampleid key value datatype
------------------------------------
1001 Name Andrew varchar(50)
1001 Date 20150129 datetime
1002 Name Anna varchar(50)
1002 Date 20150129 datetime
最终结果将是这样的,名称为 nvarchar,日期为日期时间:
该脚本是一个将其创建到视图中的存储过程。通过外部应用程序(如 SAS 和 Olive)访问视图,这些应用程序从视图中获取数据类型。当然,这并不理想,但这是我一直在尝试的任务!
sampleid name date
-----------------------------
1001 Andrew 20150129
1002 Anna 20150129
您可以使用动态 SQL 来做到这一点,您只需创建两个单独的 "new columns" 列表作为一个字符串。一个列表将包含要转换为您的数据类型的列名,第二个列表将用于 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;
我有一个键值对table。我已经使用动态 sql 创建了一个脚本,可以正确地旋转 table。但是,键具有不同的数据类型。有没有办法在枢轴期间或之后动态地投射钥匙?对于每个键,我可以将数据类型放在相同的键值对 table 中,或者放在可通过键链接的单独 table 中。
使用动态 sql 是因为我并不总是知道这些列。总会有一种数据类型。
开头的例子table:
sampleid key value datatype
------------------------------------
1001 Name Andrew varchar(50)
1001 Date 20150129 datetime
1002 Name Anna varchar(50)
1002 Date 20150129 datetime
最终结果将是这样的,名称为 nvarchar,日期为日期时间: 该脚本是一个将其创建到视图中的存储过程。通过外部应用程序(如 SAS 和 Olive)访问视图,这些应用程序从视图中获取数据类型。当然,这并不理想,但这是我一直在尝试的任务!
sampleid name date
-----------------------------
1001 Andrew 20150129
1002 Anna 20150129
您可以使用动态 SQL 来做到这一点,您只需创建两个单独的 "new columns" 列表作为一个字符串。一个列表将包含要转换为您的数据类型的列名,第二个列表将用于 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;