powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Требуется помощь в повороте таблицы
11 сообщений из 11, страница 1 из 1
Требуется помощь в повороте таблицы
    #39765010
Фотография Kast2K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день!
Есть таблица
NPB11015220253302041514...3002318

Должен получиться поворот по полю N:
1234.30010203015.2315252014.18

Из описания ясно, что столбцов может быть немеряно (до 300 за раз)

Пробовал сделать на PIVOT в динамике, но что-то упускаю.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
use tempdb

declare @SQL nvarchar(MAX)
declare @ColNames nvarchar(max)

create table Test (N int, P int, B int null)
insert into Test values (1, 10,22), (2, 20,32), (3, 30,42), (4, 15,52)

set @ColNames = ''

select @ColNames = (case when t.N IS NOT NULL THEN @ColNames + '[' + convert(nvarchar,t.N) + '],' else '' end)
from Test t
order by t.N desc

set @ColNames = LEFT(@ColNames, LEN(@ColNames) - 1)

EXEC('select '+@ColNames+'
from Test
PIVOT 
(min([N]) for N in (' + @ColNames + ')) p')



Текущий результат
4321NULL NULL NULL 1NULL NULL 2 NULLNULL 3 NULL NULL4 NULL NULL NULL

Спасибо!
...
Рейтинг: 0 / 0
Требуется помощь в повороте таблицы
    #39765030
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
EXEC('select '+@ColNames+'
from (select a.N, b.dummy, b.v from Test a cross apply (values (1, a.P), (2, a.B)) b(dummy, v)) t
PIVOT 
(min([v]) for N in (' + @ColNames + ')) p')
...
Рейтинг: 0 / 0
Требуется помощь в повороте таблицы
    #39765036
Фотография Kast2K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm,

Спасибо огромное!
про cross apply я даже не думал :( а всё так просто...
...
Рейтинг: 0 / 0
Требуется помощь в повороте таблицы
    #39765349
Glebanski
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kast2K,

Учтите, что если будете крутить 5 строк командой на 300, то время выполнения будет на 300, а не на 5.
Имеется печальный опыт...
...
Рейтинг: 0 / 0
Требуется помощь в повороте таблицы
    #39765382
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kast2K,

для поворота 300 столбцов за приемлемое время я бы попробовал использовать Integration Servces. Выполнять такое на лету, действительно, сомнительная операция.
...
Рейтинг: 0 / 0
Требуется помощь в повороте таблицы
    #39765926
Фотография Kast2K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Glebanski,
Владислав Колосов ,
Спасибо за информацию.
Данные меняются динамически 1 раз в минуту, все стобцы динамические. Вывод на экран также осуществляется 1 раз в минуту.
Пока придётся терпеть.
Про Integration services обязательно почитаю.
...
Рейтинг: 0 / 0
Требуется помощь в повороте таблицы
    #39765942
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kast2K,

SSAS rolap cube тут уместней всего
...
Рейтинг: 0 / 0
Требуется помощь в повороте таблицы
    #39765952
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kast2K,

Не слушайте паникеров.
При вашей 300-строчной таблице никаких "тормозов" не будет.
...
Рейтинг: 0 / 0
Требуется помощь в повороте таблицы
    #39766002
Фотография Kast2K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Коллеги,
позвольте вас ещё помучать немного:
первоначальный вариант немного изменился в худшую сторону
Новые данные:
N P1 A1 B2 A2 C2 D3 B3 D

По предоставленному ранее уважаемым invm методу я могу повернуть таблицу с создать до 300 столбцов.
Но, этот метод не работает на указанном примере, т.к. берется только 1 строка.

Цель:
123AABBCDD

если я правильно (что врядли, т.к. не совсем понимаю как) рассуждаю, то в данном случае есть 2 варианта развития: убогий и правильный
убогий - произвести поворот таблицы и далее пройтись update по каждому столбцу в динамике выбирая данные по каждому значению
правильный - возможно повернуть таблицу к такому виду,
1AB2AC3BD

а далее снова её повернуть? Или необходимо произвести несколько поворотов по разным столбцам и далее объединить данные?
...
Рейтинг: 0 / 0
Требуется помощь в повороте таблицы
    #39766040
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kast2K,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
use tempdb
go

declare @SQL nvarchar(MAX)
declare @ColNames nvarchar(max)

create table Test (N int, P int)

insert into Test
 (N, P)
 select
  a.N, a.P
 from
  (
   select top (30)
    row_number() over (order by (select 1)),
    rand(checksum(newid())) * 1000
   from
    master.dbo.spt_values a cross join
    master.dbo.spt_values b
   ) a(N, P) cross apply
   (select top (cast(rand(checksum(newid(), a.P)) * 3 + 1 as int)) 1 from master.dbo.spt_values) b(c);

select * from Test order by N;

select
 @ColNames = stuff(t.x.value('.', 'nvarchar(max)'), 1, 2, '')
from
 (select ', ' + quotename(cast(N as sysname)) from (select distinct N from Test) a order by N for xml path(''), type) t(x);

set statistics time on;
exec('select ' + @ColNames + '
from (select N, P, row_number() over (partition by N order by (select 1)) from Test) t(N, P, g)
pivot 
(min(P) for N in (' + @ColNames + ')) p');
set statistics time off;
go

drop table Test;
go


Для совсем правильного результата, надо бы в таблице иметь столбец, определяющий порядок строк.

ЗЫЖ Если сервер 2017, получить список столбцов можно с помощью string_agg.
...
Рейтинг: 0 / 0
Требуется помощь в повороте таблицы
    #39766305
Фотография Kast2K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm,

Спасибо огромное!
Теперь я начал понимать как взаимодействовать с PIVOT.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Требуется помощь в повороте таблицы
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]