sql - 将数据库中所有表的前 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
解决方案
为了解决这个问题,我使用了临时表,并将其放入一个循环中。不是一个好的解决方案,但它有效。必须将所有数据转换为 nvarchar 才能使其工作。
推荐阅读
- java - Firebase 回收站视图中的 Searchview 为空
- iis - IIS 10 中 IIS 高级日志记录功能的替代方案
- javascript - 将两个或多个数据绑定到 VueJs 中的表单输入
- java - 如何验证在 Selenium Java 中数据库驱动的 Web 应用程序的动态内容
- xamarin - 在 xamarin ios 中启动失败的输入字符串格式不正确
- c# - C#获取C#中某类对象的所有属性
- python - 使用交叉表时对值进行排序和删除
- git - 如何使用`git svn dcommit`而不是整个提交集将特定提交推送到svn?
- android - 仅考虑Android中一天中的一天时间计算2个给定时间戳之间的时间差?
- javascript - Google Cloud Functions 结束时:使用 Axios 时超时