Моя миссия - получить 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
Я надеюсь, что это можно решить без использования курсоров и временных таблиц, но, может быть, это путь?
EDIT:
Забыл упомянуть, я использую sqlserver (mssql)
EDIT2:
Я не очень хорош в объяснении, так что вот еще немного кода, чтобы сделать эту работу для меня.
Это добавит еще один столбец в рабочую таблицу и запрос для отображения желаемого результата. Это запрос, который должен быть «умнее», чтобы он мог обрабатывать добавленные в будущем таблицы и добавленные столбцы. (опять же, это подтверждение концепции. База данных содержит> 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