Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как значения в строке разделённые ";" превратить в столбец? / 13 сообщений из 13, страница 1 из 1
26.02.2019, 13:03
    #39779259
MAULER
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как значения в строке разделённые ";" превратить в столбец?
Здравствуйте.

Есть таблица, со столбцами col1 и col2 в которых хранятся длинные строки.
Каждая длинная строка представляет собой, даты разделенные точкой с запятой.

Возможно ли как то эти длинные строки превратить в столбец значений дат?
По сути обратная операция "for xml path"

Вот что нужно в итоге:

Login col1 col2DOMAIN\ivanov 2019-02-01;2019-02-05;2019-02-112019-02-22;2019-02-24DOMAIN\petrov 2019-03-10;2019-01-152019-02-12;2019-07-22;2019-05-22;2019-02-02

Login col move addDOMAIN\ivanov2019-02-01 1 0DOMAIN\ivanov2019-02-05 1 0DOMAIN\ivanov2019-02-11 1 0DOMAIN\ivanov2019-02-22 0 1DOMAIN\ivanov2019-02-24 0 1DOMAIN\petrov2019-03-10 1 0DOMAIN\petrov2019-01-15 1 0DOMAIN\petrov2019-02-12 0 1DOMAIN\petrov2019-07-22 0 1DOMAIN\petrov2019-05-22 0 1DOMAIN\petrov2019-02-02 0 1
...
Рейтинг: 0 / 0
26.02.2019, 13:04
    #39779261
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как значения в строке разделённые ";" превратить в столбец?
MAULER,

STRING_SPLIT
...
Рейтинг: 0 / 0
26.02.2019, 13:19
    #39779267
WarAnt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как значения в строке разделённые ";" превратить в столбец?
MAULER,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
declare @t table (id int, txt varchar(1000))

insert @t SELECT 1, '2019-02-01;2019-02-05;2019-02-11'

SELECT id,T2.Loc.query('.').value('(/row/@txt)[1]' , 'varchar(10)')  
from
(
	SELECT id, convert(xml, '<row txt="' + replace(txt, ';', '"/><row txt="') + '"/>') xm
	from @t) a
	CROSS APPLY xm.nodes('/row') as T2(Loc) 
...
Рейтинг: 0 / 0
26.02.2019, 13:25
    #39779271
BredSpit
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как значения в строке разделённые ";" превратить в столбец?
...
Рейтинг: 0 / 0
26.02.2019, 13:33
    #39779275
MAULER
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как значения в строке разделённые ";" превратить в столбец?
WarAnt,

Очень интересный пример! Но Вы используйте объявление табличной переменной. Правильно ли я понимаю, что въюху мне уже не сделать?
...
Рейтинг: 0 / 0
26.02.2019, 13:36
    #39779277
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как значения в строке разделённые ";" превратить в столбец?
MAULER,

авторНо Вы используйте объявление табличной переменной.
но у него нет вашей таблицы
...
Рейтинг: 0 / 0
26.02.2019, 13:45
    #39779285
MAULER
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как значения в строке разделённые ";" превратить в столбец?
TaPaK,

всё, туплю))
...
Рейтинг: 0 / 0
26.02.2019, 14:05
    #39779306
MAULER
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как значения в строке разделённые ";" превратить в столбец?
WarAnt,

Благодарю! Такие выкрутасы вижу в первый раз!
...
Рейтинг: 0 / 0
26.02.2019, 15:27
    #39779374
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как значения в строке разделённые ";" превратить в столбец?
...
Рейтинг: 0 / 0
26.02.2019, 16:49
    #39779432
Dzianis
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как значения в строке разделённые ";" превратить в столбец?
WarAntMAULER,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
declare @t table (id int, txt varchar(1000))

insert @t SELECT 1, '2019-02-01;2019-02-05;2019-02-11'

SELECT id,T2.Loc.query('.').value('(/row/@txt)[1]' , 'varchar(10)')  
from
(
	SELECT id, convert(xml, '<row txt="' + replace(txt, ';', '"/><row txt="') + '"/>') xm
	from @t) a
	CROSS APPLY xm.nodes('/row') as T2(Loc) 




а чего не
Код: sql
1.
2.
3.
4.
5.
6.
7.
declare @t table (id int, txt varchar(1000))

insert @t SELECT 1, '2019-02-01;2019-02-05;2019-02-11'

SELECT t.id, ss.value
FROM	   @t AS t
CROSS APPLY String_split(t.txt, ';') ss
...
Рейтинг: 0 / 0
26.02.2019, 19:47
    #39779510
MAULER
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как значения в строке разделённые ";" превратить в столбец?
Dzianis,

Могу ошибаться, но скорее всего, Ваш вариант требователен к уровню совместимости БД (не ниже 130).
...
Рейтинг: 0 / 0
27.02.2019, 16:20
    #39779955
Dzianis
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как значения в строке разделённые ";" превратить в столбец?
MAULERDzianis,

Могу ошибаться, но скорее всего, Ваш вариант требователен к уровню совместимости БД (не ниже 130).

все верно.
Но вы же не указали под какую версию интересуетесь.
вариант через nodes то же требует уровень совместимости не ниже 100
...
Рейтинг: 0 / 0
27.02.2019, 18:54
    #39780052
Сруль.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как значения в строке разделённые ";" превратить в столбец?
Спасибо Вам, порадовали старика.
Забодался в Ютубе торчать.
Резальтик, как у вас, только сортировочка по датам у вас
слегка нарушена, а так те же 11 строк.
это подготовка данных

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
if object_id('t_sql_ru') is not null
drop table [t_sql_ru]
go

CREATE TABLE [dbo].[t_sql_ru](
	[login1] [varchar](50) NULL,
	[col1] [varchar](50) NULL,
	[col2] [varchar](50) NULL,
	id int identity
) ON [PRIMARY]

GO

insert into t_sql_ru
select 'DOMAIN\ivanov','2019-02-01;2019-02-05;2019-02-11','2019-02-22;2019-02-24'


insert into t_sql_ru
select 'DOMAIN\petrov','2019-03-10;2019-01-15','2019-02-12;2019-07-22;2019-05-22;2019-02-02'


select * from [t_sql_ru]


это процедура-развал на то что промеж ;
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
/* Всякая вспомогательная муть один разик придётся прогнать 
create table t_logins(login1 varchar(50),col varchar(50),indicator varchar(50))
*/
create  proc [dbo].[p_tochka_zapytay](@login varchar(50), @col varchar(50), @indicator int)
as
begin
if charindex(';',@col)=0 
begin
insert into t_logins
select @login,@col,@indicator
return
end

insert into t_logins
select @login,left(@col,charindex(';',@col)-1),@indicator

set @col=right(@col,len(@col) - charindex(';',@col))

exec [p_tochka_zapytay] @login,@col,@indicator
return
end
go


это уже выдача результата.
Код: 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.
------------------------------------------------------------------
--delete t_logins
declare @index int, @max int
declare @login varchar(50),@col varchar(50) 

select @index=1 ,@max=(select max(id) from t_sql_ru)

while(@index<=@max)
begin

select @login=login1,@col=col1 from [t_sql_ru] where [id]=@index
execute dbo.p_tochka_zapytay @login,@col,1

select @login=login1,@col=col2 from [t_sql_ru] where [id]=@index
execute dbo.p_tochka_zapytay @login,@col,0

set @index=@index+1
end
select distinct
login1,
col col,
case when indicator=1 then 1 else 0 end [move],
case when indicator=1 then 0 else 1 end [add]
from t_logins
order by login1,col
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как значения в строке разделённые ";" превратить в столбец? / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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