sql-server - 如何在不为表指定列名的情况下将动态数据透视的结果存储到临时表中?
问题描述
我试图为表格做动态列透视。感谢这里提供的解释,我能够做到这一点(SQL Server 动态 PIVOT 查询?)
create table pivottest (Columnname varchar(100), value varchar(100)) ;
insert into pivottest values ('Age', '25'),
('Email', 'Rob@gmail.com'),
('Phone', '888888888'),
('Name', 'Rob'),
('Age', '20'),
('Email', 'Bob@gmail.com'),
('Phone', '999999999'),
('Name', 'Bob'),
('Age', '20'),
('Name', 'Ben'),
(null, null)
根据链接中提供的答案,我正在做同样的事情吗?
select *, ROW_NUMBER() over (partition by columnname order by value) Rownum
into #temp from pivottest
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX);
SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.Columnname)
FROM #temp c
FOR XML PATH(''))
,1,1,'')
set @query = 'SELECT '+@cols+' from
(
select Columnname, Rownum
, value
from #temp
) x
pivot
(
max(Value)
for Columnname in (' + @cols + ')
) p '
Execute @query
我得到了我想要的数据透视部分的结果,现在我想将数据存储到某个临时表中并在同一个会话中引用它,因为它给了我错误说对象不存在。
我可以通过这种方式将 * 选择到一些物理表中。我每次都可以参考物理表。但我想在#temp 表中做
set @query = 'SELECT '+@cols+' into dynamicpivotdata from
(
select Columnname, Rownum
, value
from #temp
) x
pivot
(
max(Value)
for Columnname in (' + @cols + ')
) p '
execute(@query)
select * from dynamicpivotdata
此外,我可以从 Temp 表中获取结果,但我必须先创建包含所有所需列的表,然后才能以这种方式引用它。但是我想做像 Select * into for temp table 一样,就像我对物理表所做的那样,而不指定列名。有没有办法将数据存储在临时表中?
create table #temp5 (Age int ,
Email varchar(100),
Name varchar(100),
Phone varchar(15))
set @query = 'SELECT '+@cols+' from
(
select Columnname, Rownum
, value
from #temp
) x
pivot
(
max(Value)
for Columnname in (' + @cols + ')
) p '
insert into #temp5 execute(@query)
select * from #temp5
我从 #temp5 和 dynamicpivotdata 获得的最终输出看起来像这样。如果可能的话,如果我从 select * into #temp table 选项中获得相同的输出,那将会很有帮助。
Age Email Name Phone
20 Bob@gmail.com Ben 888888888
20 Rob@gmail.com Bob 999999999
25 NULL Rob NULL
解决方案
看来我可以通过这种方式利用全局临时表来获得我想要的结果。
set @query = 'SELECT '+@cols+' into ##temp1 from
(
select Columnname, Rownum
, value
from #temp
) x
pivot
(
max(Value)
for Columnname in (' + @cols + ')
) p '
execute(@query)
select * from ##temp1
Age Email Name Phone
20 Bob@gmail.com Ben 888888888
20 Rob@gmail.com Bob 999999999
25 NULL Rob NULL
推荐阅读
- select - 使用选择编辑器时如何在 Tabulator 中触发更新
- c++ - 编译 g++ 时覆盖文件
- geolocation - 如何在给定坐标的情况下评估位置的偏远?
- xml - Powershell 检查是否将用户或角色添加到 .Net 授权规则
- javascript - 如何在 NuxtJS 上正确显示传单地图
- mysql - MySQL INSERT INTO ON DUPLICATE KEY UPDATE 非连续 id
- python - 我如何按 ID 分组并相互添加列
- python - 按方法值过滤 - SQL 变量过多错误
- arrays - 使用 JSON 文件,我将如何使用 JQ 列出数组内的两个对象?
- docker - 使用 nvidia gpu 创建 docker-compose 时“不允许使用‘设备’属性”