Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Развернуть строки в столбец по группам.  [new]
Гооооооссттььб
Guest
группа значение
1 10
1 20
1 30
1 40
1 50
2 110
2 120
2 130
2 140
2 150

нужно получить

1 10,20,30,40,50
2 110,120,130,140,150

FOR XML PATH выполняет для всех строк ....
13 ноя 13, 15:30    [15122224]     Ответить | Цитировать Сообщить модератору
 Re: Развернуть строки в столбец по группам.  [new]
Glory
Member

Откуда:
Сообщений: 104760
Гооооооссттььб
FOR XML PATH выполняет для всех строк ....

FOR XML PATH выполняет для тех строк, которые вы отфильтруете
13 ноя 13, 15:37    [15122333]     Ответить | Цитировать Сообщить модератору
 Re: Развернуть строки в столбец по группам.  [new]
o-o
Guest
Гооооооссттььб,
лень данные перенабивать,
вот готовый пример от iap (C)

DECLARE @T TABLE(N INT, CurrencyName NVARCHAR(100));
INSERT @T(N, CurrencyName) 
select 1, N'Доллары' union all
select 1, N'Франки' union all
select 1, N'Евро' union all
select 2, N'Рубли' union all
select 2, N'Тубрики' ;

SELECT T.N
,STUFF((SELECT N', '+CurrencyName FROM @T TT WHERE TT.N=T.N ORDER BY TT.CurrencyName FOR XML PATH(''), TYPE).value(N'.',N'NVARCHAR(MAX)'),1,2,N'') CurrencyNames
FROM @T T
GROUP BY T.N
ORDER BY T.N;
------------------------------
N	CurrencyNames
1	Доллары, Евро, Франки
2	Рубли, Тубрики
13 ноя 13, 15:38    [15122351]     Ответить | Цитировать Сообщить модератору
 Re: Развернуть строки в столбец по группам.  [new]
Гооооооссттььб
Guest
Ух ты как я думал можно обычным груп бай обойтись.
Спасибо буду разбираться.
13 ноя 13, 15:43    [15122422]     Ответить | Цитировать Сообщить модератору
 Re: Развернуть строки в столбец по группам.  [new]
Гооооооссттььб
Guest
Есть какая то ссылка на использования FOR XML PATH ?

STUFF((SELECT N', '+CurrencyName FROM @T TT WHERE TT.N=T.N ORDER BY TT.CurrencyName FOR XML PATH(''), TYPE).value(N'.',N'NVARCHAR(MAX)'),1,2,N'')


что то это мудренное :)
13 ноя 13, 15:45    [15122449]     Ответить | Цитировать Сообщить модератору
 Re: Развернуть строки в столбец по группам.  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Гооооооссттььб
Есть какая то ссылка на использования FOR XML PATH ?

STUFF((SELECT N', '+CurrencyName FROM @T TT WHERE TT.N=T.N ORDER BY TT.CurrencyName FOR XML PATH(''), TYPE).value(N'.',N'NVARCHAR(MAX)'),1,2,N'')


что то это мудренное :)

Ничего сложного нет.
Сперва вычисляется XML-значение:
(SELECT N', '+CurrencyName FROM @T TT WHERE TT.N=T.N ORDER BY TT.CurrencyName FOR XML PATH(''), TYPE)

назовём его X. Оно содержит данные по CurrencyName, относящимся к значению T.N (т.е. это коррелированный подзапрос, ссылающийся на внешнюю таблицу @T).

Дальше это XML-значение преобразуется в nvarchar(max):
(X).value(N'.',N'NVARCHAR(MAX)')

Получается значение Y, в котором CurrencyName перечислены через запятую, и ещё в начале есть запятая с пробелом.

Чтобы убрать эти первые два символа, используется функция STUFF:
STUFF(Y, 1, 2, N'')
13 ноя 13, 15:53    [15122536]     Ответить | Цитировать Сообщить модератору
 Re: Развернуть строки в столбец по группам.  [new]
Гооооооссттььб
Guest
declare @t table(a int,b int)

insert into @t(a, b) values
(1,10),
(1,20),
(1,30),
(1,40),
(1,50),
(2,110),
(2,120),
(2,130),
(2,140),
(2,150)

select a,
stuff((select ',',cast(b as varchar) from @t t2 where t1.a=t2.a for xml path('')),1,1,'') s 
from @t t1
group by a


Сделал так чем это неправильно ?
13 ноя 13, 15:57    [15122590]     Ответить | Цитировать Сообщить модератору
 Re: Развернуть строки в столбец по группам.  [new]
Гость333
Member

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

Для целых чисел, в общем-то, правильно.
Разница проявляется для строк, в которых есть спецсимволы XML.
Сравните:
select '&<>' for xml path('')

select (select '&<>' for xml path(''), type).value('.', 'nvarchar(max)')
13 ноя 13, 16:03    [15122649]     Ответить | Цитировать Сообщить модератору
 Re: Развернуть строки в столбец по группам.  [new]
o-o
Guest
Гооооооссттььб,
повезло, что числа.
если бы были строки, могли бы огрести на "xml-ых символах"

declare @t table(a int,b varchar(10))

insert into @t(a, b) values
(1,'<10>'),
(1,'20'),
(1,'30'),
(1,'40'),
(1,'50'),
(2,'110'),
(2,'120'),
(2,'130'),
(2,'140'),
(2,'150')

select a,
stuff((select ','+ b from @t t2 where t1.a=t2.a for xml path('')),1,1,'') s 
from @t t1
group by a
-----------------------------------------
a	s
1	<10>,20,30,40,50
2	110,120,130,140,150
13 ноя 13, 16:05    [15122666]     Ответить | Цитировать Сообщить модератору
 Re: Развернуть строки в столбец по группам.  [new]
Гооооооссттььб
Guest
Ага все понятно, всем огромное спасибо !!!
13 ноя 13, 16:11    [15122731]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить