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

Откуда:
Сообщений: 83
Привет всем

Есть таблица типа

id v
1 1
1 2
1 3
1 4

Как сделать из этого такую без использования функции

id| v
1 | 1, 2, 3, 4

Что использовать? какой запрос должен быть?
15 фев 12, 12:25    [12094560]     Ответить | Цитировать Сообщить модератору
 Re: Как схлопнуть список  [new]
Добрый Э - Эх
Guest
SQL2005: популярные задачи форума и CTE :
Задача №4. Объединить значения строкового столбца в одну строку;
Задача №5. Объединить значения строкового столбца в строки, соответствующие некоторому условию группировки.
15 фев 12, 12:33    [12094656]     Ответить | Цитировать Сообщить модератору
 Re: Как схлопнуть список  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
SELECT T.id,v=STUFF((SELECT ', '+TT.v FROM T TT WHERE TT.id=T.id FOR XML PATH('')),1,2,'')
FROM T;
15 фев 12, 12:44    [12094807]     Ответить | Цитировать Сообщить модератору
 Re: Как схлопнуть список  [new]
кириллk
Member

Откуда:
Сообщений: 1062
iap,

А обратно расхлопнуть можно? :)
15 фев 12, 13:21    [12095206]     Ответить | Цитировать Сообщить модератору
 Re: Как схлопнуть список  [new]
San4ooo
Member

Откуда:
Сообщений: 83
Бланодарю
15 фев 12, 13:36    [12095332]     Ответить | Цитировать Сообщить модератору
 Re: Как схлопнуть список  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
iap
SELECT T.id,v=STUFF((SELECT ', '+TT.v FROM T TT WHERE TT.id=T.id FOR XML PATH('')),1,2,'')
FROM T;
Поскольку всё пишу из головы, то иногда упускаю кое-что.
В данном случае надо же от дублирующих строк избавиться:
SELECT T.id,v=STUFF((SELECT ', '+TT.v FROM T TT WHERE TT.id=T.id FOR XML PATH('')),1,2,'')
FROM T
GROUP BY T.id;
Или DISTINCT
15 фев 12, 14:39    [12095947]     Ответить | Цитировать Сообщить модератору
 Re: Как схлопнуть список  [new]
igor2222
Member

Откуда: Харків
Сообщений: 1233
Чтоб "расхлопнуть" есть вот такая штука:
mdq.Split 

А работает примерно так:
CREATE FUNCTION f_splitDelimitedString
(
  @delimited nvarchar(max),
  @delimiter nvarchar(100)
) RETURNS @t TABLE
(
  val nvarchar(max)
)
AS
BEGIN
  declare @xml xml
  set @xml = N'<root><r>' + replace(@delimited,@delimiter,'</r><r>') + '</r></root>'

  insert into @t(val)
  select 
    r.value('.','varchar(1000)') as item
  from @xml.nodes('//root/r') as records(r)

  RETURN
END
15 фев 12, 14:49    [12096034]     Ответить | Цитировать Сообщить модератору
 Re: Как схлопнуть список  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
igor2222
Чтоб "расхлопнуть" есть вот такая штука:
mdq.Split 

А работает примерно так:
CREATE FUNCTION f_splitDelimitedString
(
  @delimited nvarchar(max),
  @delimiter nvarchar(100)
) RETURNS @t TABLE
(
  val nvarchar(max)
)
AS
BEGIN
  declare @xml xml
  set @xml = N'<root><r>' + replace(@delimited,@delimiter,'</r><r>') + '</r></root>'

  insert into @t(val)
  select 
    r.value('.','varchar(1000)') as item
  from @xml.nodes('//root/r') as records(r)

  RETURN
END
Небось, что-то такое побыстрее работать будет?
15 фев 12, 14:55    [12096075]     Ответить | Цитировать Сообщить модератору
 Re: Как схлопнуть список  [new]
igor2222
Member

Откуда: Харків
Сообщений: 1233
iap, если парсить csv-шки- то однозначно. Мой вариант больше для одноразовых скриптов, когда отдельные функции противопоказаны, а строки - до сотни значений через разделитель. А вообще наше дело предложить :)
15 фев 12, 15:00    [12096126]     Ответить | Цитировать Сообщить модератору
 Re: Как схлопнуть список  [new]
кириллk
Member

Откуда:
Сообщений: 1062
igor2222,

A здесь UNPIVOT не прокатит?
15 фев 12, 15:01    [12096136]     Ответить | Цитировать Сообщить модератору
 Re: Как схлопнуть список  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
кириллk
igor2222,

A здесь UNPIVOT не прокатит?
Если из нескольких колонок надо сделать одну, то конечно.
Но тут же имеется в виду одна строковая колонка со значениями через запятую...

Кстати, и эта статья всё ещё полезна и интересна.

Кроме того, тема может быть раскрыта и в местных блогах (не помню просто)
15 фев 12, 15:09    [12096202]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить