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

Откуда: Киев
Сообщений: 1387
Подскажите как можна в запросе разделить колонки если в строке данные хранятся как
данные#данные#данные#...

то есть если есть например запрос

select [id], [number], [data], [date] from table


в колонке data данные хранятся как данные#данные#данные#

Необходимо в запросе разделить данные на отдельные колонки примерно так

select id, number, data1, data2, data3, ... dataN, date from table


Спасибо.
4 апр 13, 15:27    [14136249]     Ответить | Цитировать Сообщить модератору
 Re: Разделить динамически колонки  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22550
можно функцию скалярную нагугписать, которая будет выдавать часть строки
на вход строка, разделитель и номер подстроки
4 апр 13, 15:32    [14136286]     Ответить | Цитировать Сообщить модератору
 Re: Разделить динамически колонки  [new]
Glory
Member

Откуда:
Сообщений: 104751
VIT2708
в колонке data данные хранятся как данные#данные#данные#

Тогда они и так уже будут отображаться почти как поля
Чего же больше ?
4 апр 13, 15:33    [14136297]     Ответить | Цитировать Сообщить модератору
 Re: Разделить динамически колонки  [new]
Glory
Member

Откуда:
Сообщений: 104751
select '#'+[id]+'#'+[number]+'#'+ [data]+'#'+[date] from table
4 апр 13, 15:34    [14136309]     Ответить | Цитировать Сообщить модератору
 Re: Разделить динамически колонки  [new]
VIT2708
Member [заблокирован]

Откуда: Киев
Сообщений: 1387
Glory,

эти данные могут меняться строка может быть как длиннее так и короче мне просто хотелось в запросе разделить эту строку и сформировать нормальную таблицу данных на клиенте(сайте), и не хотелось всю логику по разбивке выносить на сторону клиента. Мне проще вынести обработку данных на сторону клиента но хотелось все это сделать на сервере но вот не знаю как?
4 апр 13, 15:42    [14136373]     Ответить | Цитировать Сообщить модератору
 Re: Разделить динамически колонки  [new]
Glory
Member

Откуда:
Сообщений: 104751
VIT2708
эти данные могут меняться строка может быть как длиннее так и короче мне просто хотелось в запросе разделить эту строку

Вот и мне интересно, если в каждой записи число элементов в этом поле разное, то число полей в каждой записи результата должно тоже меняться что ли ?
4 апр 13, 15:45    [14136403]     Ответить | Цитировать Сообщить модератору
 Re: Разделить динамически колонки  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
раз неизвестное заранее количество требуемых столбцов - значит динамический запрос... ЯТД...
4 апр 13, 15:45    [14136404]     Ответить | Цитировать Сообщить модератору
 Re: Разделить динамически колонки  [new]
Гость333
Member

Откуда:
Сообщений: 3683
VIT2708
эти данные могут меняться строка может быть как длиннее так и короче

То есть в однйо строка может быть Данные1#, в другой Данные1#Данные2#, в третьей Данные1#Данные2#Данные3#? Что в таком случае должен выдавать итоговый запрос?
4 апр 13, 15:46    [14136416]     Ответить | Цитировать Сообщить модератору
 Re: Разделить динамически колонки  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22550
Cygapb-007
раз неизвестное заранее количество требуемых столбцов - значит динамический запрос... ЯТД...
автор гоаорил про длину строки. про количество столбцов не говорил. пока...
4 апр 13, 15:46    [14136418]     Ответить | Цитировать Сообщить модератору
 Re: Разделить динамически колонки  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Гость333
в однйо строка

в одной строке :-)
4 апр 13, 15:47    [14136426]     Ответить | Цитировать Сообщить модератору
 Re: Разделить динамически колонки  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
Glory
VIT2708
эти данные могут меняться строка может быть как длиннее так и короче мне просто хотелось в запросе разделить эту строку

Вот и мне интересно, если в каждой записи число элементов в этом поле разное, то число полей в каждой записи результата должно тоже меняться что ли ?
число полей в результате=MAX(len(text)-len(replace(text,'#','')))+1 ?
4 апр 13, 15:49    [14136443]     Ответить | Цитировать Сообщить модератору
 Re: Разделить динамически колонки  [new]
VIT2708
Member [заблокирован]

Откуда: Киев
Сообщений: 1387
Glory,

Дело вот в чем эти данные я загружаю из excel так как я не знаю количество колонок то все данные то есть строки хранятся в одной колонке с разделителем # так что они хоть разные но за один запрос будут однородными
4 апр 13, 15:54    [14136472]     Ответить | Цитировать Сообщить модератору
 Re: Разделить динамически колонки  [new]
VIT2708
Member [заблокирован]

Откуда: Киев
Сообщений: 1387
Гость333
Гость333
в однйо строка

в одной строке :-)


ну очепятка, бывает
4 апр 13, 15:56    [14136493]     Ответить | Цитировать Сообщить модератору
 Re: Разделить динамически колонки  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
хм... что-то меня снова не туда понесло(((
4 апр 13, 15:57    [14136503]     Ответить | Цитировать Сообщить модератору
 Re: Разделить динамически колонки  [new]
VIT2708
Member [заблокирован]

Откуда: Киев
Сообщений: 1387
Паганель
Cygapb-007
раз неизвестное заранее количество требуемых столбцов - значит динамический запрос... ЯТД...
автор гоаорил про длину строки. про количество столбцов не говорил. пока...


так вот эту строку надо разбить и создать необходимое количество столбцов
4 апр 13, 15:57    [14136506]     Ответить | Цитировать Сообщить модератору
 Re: Разделить динамически колонки  [new]
VIT2708
Member [заблокирован]

Откуда: Киев
Сообщений: 1387
Гость333
VIT2708
эти данные могут меняться строка может быть как длиннее так и короче

То есть в однйо строка может быть Данные1#, в другой Данные1#Данные2#, в третьей Данные1#Данные2#Данные3#? Что в таком случае должен выдавать итоговый запрос?


нет длинна фиксирована за один запрос

например сегодня в запросе может быть ....#...#...#
затра ...#...#
4 апр 13, 15:59    [14136518]     Ответить | Цитировать Сообщить модератору
 Re: Разделить динамически колонки  [new]
VIT2708
Member [заблокирован]

Откуда: Киев
Сообщений: 1387
VIT2708,

Мне проще показать на примере

select id, title, string.split("#") as data[] from table

и в результате должно быть

select id, title, data[1], data[2], data[..], data[N] as data[] from table
4 апр 13, 16:03    [14136538]     Ответить | Цитировать Сообщить модератору
 Re: Разделить динамически колонки  [new]
AnyKey45
Guest
VIT2708
Glory,

Дело вот в чем эти данные я загружаю из excel так как я не знаю количество колонок то все данные то есть строки хранятся в одной колонке с разделителем # так что они хоть разные но за один запрос будут однородными

т.е. в экселе данные раскиданы по колонкам без # ??????
4 апр 13, 16:06    [14136559]     Ответить | Цитировать Сообщить модератору
 Re: Разделить динамически колонки  [new]
VIT2708
Member [заблокирован]

Откуда: Киев
Сообщений: 1387
AnyKey45,

да, но неизвестно количество колонок, в зависимости от условий их количество меняется
4 апр 13, 16:08    [14136566]     Ответить | Цитировать Сообщить модератору
 Re: Разделить динамически колонки  [new]
AnyKey45
Guest
VIT2708,

openrowset ?
- заберет данные по колонкам сразу без всяких #
4 апр 13, 16:12    [14136595]     Ответить | Цитировать Сообщить модератору
 Re: Разделить динамически колонки  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22550
VIT2708
да, но неизвестно количество колонок, в зависимости от условий их количество меняется
но предназначение-то у них разное
например, в одной колонке имя, в другой адрес, в третьй телефон...
вот и создайте в БД MSSQL поля под каждую из них
пусть даже иногда там будет пусто (ну нету у сотрудника второго телефона например)
4 апр 13, 16:13    [14136602]     Ответить | Цитировать Сообщить модератору
 Re: Разделить динамически колонки  [new]
VIT2708
Member [заблокирован]

Откуда: Киев
Сообщений: 1387
Паганель
VIT2708
да, но неизвестно количество колонок, в зависимости от условий их количество меняется
но предназначение-то у них разное
например, в одной колонке имя, в другой адрес, в третьй телефон...
вот и создайте в БД MSSQL поля под каждую из них
пусть даже иногда там будет пусто (ну нету у сотрудника второго телефона например)


эти поля есть

эта колонка для результатов опросников, в зависимости от количества вопросов будет разное количество ответов
4 апр 13, 16:17    [14136642]     Ответить | Цитировать Сообщить модератору
 Re: Разделить динамически колонки  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22550
VIT2708
эта колонка для результатов опросников, в зависимости от количества вопросов будет разное количество ответов
имхо тут точно БД перепроектировать надо
4 апр 13, 16:24    [14136680]     Ответить | Цитировать Сообщить модератору
 Re: Разделить динамически колонки  [new]
Glory
Member

Откуда:
Сообщений: 104751
VIT2708
Дело вот в чем эти данные я загружаю из excel так как я не знаю количество колонок то все данные то есть строки хранятся в одной колонке с разделителем # так что они хоть разные но за один запрос будут однородными

Тогда тем более непонятно, зачем для _отображения_ на клиенте так обязательно нужно, чтобы значение поля было именно разделено на столбцы. Все уже и так расположено через разделитель (однокоренное слово с "разделить")
4 апр 13, 16:30    [14136714]     Ответить | Цитировать Сообщить модератору
 Re: Разделить динамически колонки  [new]
Чайник-стажёр
Guest
VIT2708,

Задача странная, поэтому и решение будет стрёмным :)
На клиенте в первой строке будут приходить имена полей для дальнейшего разбора.
Если название поля пустое, значит в текущей выборке его не содержится...
Но вообще, реально, тут что-то надо делать как минимум с форматом общения клиента с базой.

declare @t table ([id] int, [date] date, data varchar(max));
declare @Delimiter varchar(3) = '#';

insert @t([id], [date], [data]) 
values	(null, null, 'Поле1#Столбец2#Колонка3') --строка с заголовками динамически получаемых столбцов
	,	(1, '19000101', 'va<g>l11#val12#val13')
	,	(2, sysdatetime(), 'val21#va>l22#val23');
	
select	p.*
from	(
			select	nq.id
				,	nq.[date]
				,	'Field' + n.f.value('./@n', 'varchar(10)') as FieldName
				,	n.f.value('data(.)', 'nvarchar(max)') as FieldValue
			from	(
						select	xnn.id
							,	xnn.[date]
							,	xnn.xn.query('
									for $r in x[2]/r
										return <field n="{number($r)}">{data(x[1]/f[position()=$r])}</field>
									'
								) as q
						from	(
									select	xfc.*
										,	rrx1.*
										,	(
												select	u.x
												from	(
															 select xfc.xv as x
															 union all
															 select rrx1.xx
														 ) as u
												for xml path(''), type
											) as xn
									from	(
												select	*
													,	xv.value('count(f)', 'int') as AdditionalFieldCount
												from	(
															select	[id],
																	[date],
																	cast(replace (
																		(select data as [text()] for xml path('f'))
																	,	(select @Delimiter for xml path(''))
																	,	'</f><f>'
																	) as xml) as xv
															from @t
														) as x
											) as xfc
											cross apply (
															select	(
																		select	row_number() over (order by v) as r
																		from	(
																					select cast(replicate('<h/>', xfc.AdditionalFieldCount) as xml) as hx
																				) as hxt
																				cross apply hxt.hx.nodes('h') as h(v)
																		for xml path(''), type
																	) as xx
														) as rrx1
								) as xnn
				) as nq
				cross apply q.nodes('field') as n(f)
	) as ff
	pivot(max(FieldValue) for FieldName in (
		Field1, 
		Field2, 
		Field3, 
		Field4, 
		Field5, 
		Field6, 
		Field7, 
		Field8, 
		Field9, 
		Field10, 
		Field11, 
		Field12)
	) as p
4 апр 13, 18:06    [14137262]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить