формирование строк по условию

,,,^..^,,,
Дата: 21.04.2015 10:05:23
доброго всем дня!
есть таблицы вида
create table #t1(id int identity(1, 1), name varchar(10))

insert #t1(name)
values	('10'), ('максим'), ('56'), ('вася'), ('13'), ('даша'), ('8000'), ('76'), ('123'), ('12222'), ('44'), ('нет'), ('20'), ('14444'), ('1444455')

create table #t2(id int identity(1, 1), list varchar(50))


необходимо в порядке возрастания id из таблицы #t1 "склеивать" поле name через разделитель (например, пробел), до тех пор, пока сформированная склеенная строка не превышает размерность поля list из #t2, при этом "огрызков" строк быть не должно, т.е. если очередное name не помещается целиком, с него следует начать формировать следующую строку для #t2.

возможно ли реализовать такое без CTE, на одних джойнах?
Gviber
Дата: 21.04.2015 10:45:42
Возможно.

Через xml:
select
STUFF(ISNULL(CAST(( 
	SELECT ','+cast(Col as varchar)
	FROM mytable p
	order by col
	for xml path('') 
) as xml).value('.', 'varchar(max)'),''),1,1,'')
,,,^..^,,,
Дата: 21.04.2015 10:52:18
основная задача - разбить на группы перед склейкой строк. а склеить можно хоть через for xml path, хоть курсором, хоть через собственную агрегирующую CLR-функцию.

суть задачи - верно распределить на группы, которые бы помещались в поле list
invm
Дата: 21.04.2015 11:02:24
,,,^..^,,,
суть задачи - верно распределить на группы
select
 *,
 sum(len(name) + <длина разделителя>) over (order by id) / <размерность поля list> as grp
from
 #t1;
Gviber
Дата: 21.04.2015 11:04:25
Вам нужно для начала определиться какой алгоритм разбиения на группы.

Есть стандартная оконная функция:
select Name,NTILE(ZN) OVER(order by id) from table

где ZN количество элементов в группе. Подходит ли это разбиение?
ЦБ
Дата: 21.04.2015 11:13:56
invm
,,,^..^,,,
суть задачи - верно распределить на группы
select
 *,
 sum(len(name) + <длина разделителя>) over (order by id) / <размерность поля list> as grp
from
 #t1;
Имхо, в общем случае, будет "лажать"
Вот, все слова - 4 символа, "размерность поля list"=5, разделителя - нет
select 4/5, (4+4)/5, (4+4+4)/5, (4+4+4+4)/5, (4+4+4+4+4)/5, (4+4+4+4+4+4)/5

----------- ----------- ----------- ----------- ----------- -----------
0 1 2 3 4 4

А по алгоритму ТС, все слова должны попадать в разные группы
,,,^..^,,,
Дата: 21.04.2015 11:38:07
ЦБ,

да, я простым делением тоже на эти грабли наступил, поэтому сюда и написал
Minamoto
Дата: 21.04.2015 11:39:55
,,,^..^,,,, попробовал я реализовать вариант, и как то пока не получается через джойны. А почему нельзя CTE использовать? И, если уж нет возможности использовать CTE, возможно через цикл while сделать?
Добрый Э - Эх
Дата: 21.04.2015 11:40:57
,,,^..^,,,,

задача - боян, решений - есть несколько. искать в тырнете по фразе "Reset Running Total"
,,,^..^,,,
Дата: 21.04.2015 11:41:33
Gviber
Вам нужно для начала определиться какой алгоритм разбиения на группы.

Есть стандартная оконная функция:
select Name,NTILE(ZN) OVER(order by id) from table

где ZN количество элементов в группе. Подходит ли это разбиение?


нет, эта функция не подходит вообще. изначально неизвестно сколько элементов в группу попадает ведь. группа может быть неполной, если следующее слово целиком не помещается и т.д.