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

Откуда: Москва, ВАО
Сообщений: 306
Всем здрасте.

Тут вот уперся в задачку сделать сдвиг данных в одном запросе, в принципе решается в несколько итераций, но хочется в одну. Количество полей ограничено.

Запрос собирает левым и возвращает следующий набор:
поле1 поле2 поле3 поле4 поле5 поле6
дан1 null null null null null
дан2 null null null null дан21
дан3 null null null дан31 дан32
дан4 дан41 дан42 дан43 дан44 дан45
дан5 null дан51 дан52 дан53 дан54


надо получить
поле1 поле2 поле3 поле4 поле5 поле6
дан1 null null null null null
дан2 дан21 null null null null
дан3 дан31 дан32 null null null
дан4 дан41 дан42 дан43 дан44 дан45
дан5 дан51 дан52 дан53 дан54 null


Наверно вечер воскресенья дает о себе знать :)
20 авг 17, 21:02    [20737320]     Ответить | Цитировать Сообщить модератору
 Re: Сдвиг данных в одном запросе  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 3708
Может так?
Как ставят книги в шкафу по цвету обложек

дан1 null null null null null
дан2 дан21 null null null null
дан3 дан31 дан32 null null null
дан5 дан51 дан52 дан53 дан54 null
дан4 дан41 дан42 дан43 дан44 дан45
20 авг 17, 21:29    [20737369]     Ответить | Цитировать Сообщить модератору
 Re: Сдвиг данных в одном запросе  [new]
Добрый Э - Эх
Guest
babys,
Coalesce тебе в помощь...
20 авг 17, 21:38    [20737383]     Ответить | Цитировать Сообщить модератору
 Re: Сдвиг данных в одном запросе  [new]
invm
Member

Откуда: Москва
Сообщений: 9345
declare @t table (f1 varchar(10), f2 varchar(10), f3 varchar(10), f4 varchar(10), f5 varchar(10), f6 varchar(10));

insert into @t
values
 ('дан1', null, null, null, null, null),
 ('дан2', null, null, null, null, 'дан21'),
 ('дан3', null, null, null, 'дан31', 'дан32'),
 ('дан4', 'дан41', 'дан42', 'дан43', 'дан44', 'дан45'),
 ('дан5', null, 'дан51', 'дан52', 'дан53', 'дан54');


select
 c.n.value('f[1]', 'varchar(10)'),
 c.n.value('f[2]', 'varchar(10)'),
 c.n.value('f[3]', 'varchar(10)'),
 c.n.value('f[4]', 'varchar(10)'),
 c.n.value('f[5]', 'varchar(10)'),
 c.n.value('f[6]', 'varchar(10)')
from
 @t t cross apply
 (select a.f from (values (t.f1), (t.f2), (t.f3), (t.f4), (t.f5), (t.f6)) a(f) for xml path(''), type) b(x) cross apply
 b.x.nodes('/') c(n);
20 авг 17, 21:40    [20737390]     Ответить | Цитировать Сообщить модератору
 Re: Сдвиг данных в одном запросе  [new]
babys
Member

Откуда: Москва, ВАО
Сообщений: 306
Ролг Хупин, без разницы, это уйдет в обмен.
20 авг 17, 22:00    [20737419]     Ответить | Цитировать Сообщить модератору
 Re: Сдвиг данных в одном запросе  [new]
babys
Member

Откуда: Москва, ВАО
Сообщений: 306
invm, огромное мерси
20 авг 17, 22:07    [20737442]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить