首页 > 解决方案 > 将数据库中所有表的前 100 行数据透视到列中

问题描述

我的任务是从数据库中的所有表中获取前 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

标签: sqlsql-serverpivot

解决方案


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


推荐阅读