Поверните верхние 100 строк в столбцы для всех таблиц в базе данных - PullRequest
0 голосов
/ 26 апреля 2019

Моя миссия - получить 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

1 Ответ

0 голосов
/ 27 мая 2019

Чтобы решить эту проблему, я использовал временную таблицу и поместил ее в цикл.Не очень хорошее решение, но оно работает.Чтобы все заработало, пришлось привести все данные в nvarchar.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...