将数据库中所有表的前100行透视成列

时间:2019-04-26 08:29:01

标签: sql sql-server pivot

我的任务是从数据库的所有表中获取前100行,并将它们合并为一个结果输出。 由于表具有不同的列数和类型,因此,我看到的唯一方法是将行号作为列,并将列名放在第一列中。所有表格的第1行将在第2列中表示,依此类推。

我在sql方面的技能不足以解决这一问题,因此我希望社区能够在这方面为我提供帮助。

以下是一些代码:

--Example table
create table Worker (Id int, FirstName nvarchar(max));


--Some data
insert into Worker values (1,'John'),(2,'Jane'),(3,'Elisa');

--Static pivot example
select * from (select
ROW_NUMBER() over (order by Id) as IdRows, FirstName  from worker) as st
pivot
(
    max(FirstName) for IdRows in ([1],[2],[3])
) as pt;

--Code to incorporate to get column name on column 1
select name from sys.columns where object_id('Worker') = object_id;

--Cleanup
drop table Worker;

我认为静态枢轴必须是动态的,这不是问题。上面的代码只是为了创建概念证明,因此我有一些基础。

查询的最终结果应如下:

Column      1       2       3
FirstName   John    Erina   Jane

我希望可以在不使用游标和临时表的情况下解决此问题,但这也许是解决方法?

编辑: 忘记了,我正在使用sqlserver(mssql)

EDIT2: 我不太擅长解释,因此这里有更多代码可以帮助我完成这项工作。 这会将另一列添加到Worker表中,并添加一个查询以显示所需的结果。该查询必须“更智能”,以便可以处理将来添加的表和添加的列。 (再次,这是一个概念证明。该数据库具有> 200个表和> 1000列)

--Add a column
alter table Worker add LastName nvarchar(max);
--Add some data
update Worker set LastName = 'Smith' where Id = 1;
update Worker set LastName = 'Smith' where Id = 2;
update Worker set LastName = 'Smith' where Id = 3;

--Query to give desired output (top 100, but only 3 rows in this table)
select 'FirstName' as 'Column',* from (select top 100 
ROW_NUMBER() over (order by Id) as IdRows, FirstName  from worker) as st
pivot
(
    max(FirstName) for IdRows in ([1],[2],[3])
) as pt
union
select 'LastName' as 'Column',* from (select top 100 
ROW_NUMBER() over (order by Id) as IdRows, LastName  from worker) as st
pivot
(
    max(LastName) for IdRows in ([1],[2],[3])
) as pt

1 个答案:

答案 0 :(得分:0)

为解决此问题,我使用了临时表,并将其放入循环中。这不是一个好的解决方案,但它可以工作。必须将所有数据转换为nvarchar才能使其正常工作。