Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Требуется помощь в повороте таблицы  [new]
Kast2K
Member

Откуда: Санкт-Петербург
Сообщений: 512
Добрый день!
Есть таблица
NPB
11015
22025
33020
41514
...
3002318


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


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

Пробовал сделать на PIVOT в динамике, но что-то упускаю.
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')


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


Спасибо!
25 янв 19, 15:02    [21794349]     Ответить | Цитировать Сообщить модератору
 Re: Требуется помощь в повороте таблицы  [new]
invm
Member

Откуда: Москва
Сообщений: 9351
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')
25 янв 19, 15:33    [21794382]     Ответить | Цитировать Сообщить модератору
 Re: Требуется помощь в повороте таблицы  [new]
Kast2K
Member

Откуда: Санкт-Петербург
Сообщений: 512
invm,

Спасибо огромное!
про cross apply я даже не думал :( а всё так просто...
25 янв 19, 15:48    [21794396]     Ответить | Цитировать Сообщить модератору
 Re: Требуется помощь в повороте таблицы  [new]
Glebanski
Member

Откуда: Msk ->NL
Сообщений: 308
Kast2K,

Учтите, что если будете крутить 5 строк командой на 300, то время выполнения будет на 300, а не на 5.
Имеется печальный опыт...
26 янв 19, 19:23    [21794909]     Ответить | Цитировать Сообщить модератору
 Re: Требуется помощь в повороте таблицы  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7780
Kast2K,

для поворота 300 столбцов за приемлемое время я бы попробовал использовать Integration Servces. Выполнять такое на лету, действительно, сомнительная операция.
26 янв 19, 21:46    [21794981]     Ответить | Цитировать Сообщить модератору
 Re: Требуется помощь в повороте таблицы  [new]
Kast2K
Member

Откуда: Санкт-Петербург
Сообщений: 512
Glebanski,
Владислав Колосов ,
Спасибо за информацию.
Данные меняются динамически 1 раз в минуту, все стобцы динамические. Вывод на экран также осуществляется 1 раз в минуту.
Пока придётся терпеть.
Про Integration services обязательно почитаю.
28 янв 19, 14:36    [21795885]     Ответить | Цитировать Сообщить модератору
 Re: Требуется помощь в повороте таблицы  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4740
Kast2K,

SSAS rolap cube тут уместней всего
28 янв 19, 14:54    [21795910]     Ответить | Цитировать Сообщить модератору
 Re: Требуется помощь в повороте таблицы  [new]
invm
Member

Откуда: Москва
Сообщений: 9351
Kast2K,

Не слушайте паникеров.
При вашей 300-строчной таблице никаких "тормозов" не будет.
28 янв 19, 15:03    [21795923]     Ответить | Цитировать Сообщить модератору
 Re: Требуется помощь в повороте таблицы  [new]
Kast2K
Member

Откуда: Санкт-Петербург
Сообщений: 512
Коллеги,
позвольте вас ещё помучать немного:
первоначальный вариант немного изменился в худшую сторону
Новые данные:
N P
1 A
1 B
2 A
2 C
2 D
3 B
3 D


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

Цель:
123
AAB
BCD
D


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


а далее снова её повернуть? Или необходимо произвести несколько поворотов по разным столбцам и далее объединить данные?
28 янв 19, 16:15    [21796002]     Ответить | Цитировать Сообщить модератору
 Re: Требуется помощь в повороте таблицы  [new]
invm
Member

Откуда: Москва
Сообщений: 9351
Kast2K,

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.
28 янв 19, 16:44    [21796043]     Ответить | Цитировать Сообщить модератору
 Re: Требуется помощь в повороте таблицы  [new]
Kast2K
Member

Откуда: Санкт-Петербург
Сообщений: 512
invm,

Спасибо огромное!
Теперь я начал понимать как взаимодействовать с PIVOT.
29 янв 19, 09:18    [21796489]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить