Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Требуется помощь в повороте таблицы / 11 сообщений из 11, страница 1 из 1
25.01.2019, 15:02
    #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
25.01.2019, 15:33
    #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
25.01.2019, 15:48
    #39765036
Kast2K
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Требуется помощь в повороте таблицы
invm,

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

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

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

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

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

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

Цель:
123AABBCDD

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

а далее снова её повернуть? Или необходимо произвести несколько поворотов по разным столбцам и далее объединить данные?
...
Рейтинг: 0 / 0
28.01.2019, 16:44
    #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
29.01.2019, 09:18
    #39766305
Kast2K
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Требуется помощь в повороте таблицы
invm,

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


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