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

Имеем:
declare @t table(i int NULL, s nvarchar(max) NULL)
insert @t(i,s) values(3, 'Рассказать'), (3, 'что'), (3, 'солнце'), (3, 'встало')
insert @t(i,s) values(1, 'Улыбок'), (1, 'тебе'), (1, 'дед'), (1, 'мокар')
insert @t(i,s) values(2, 'Я'), (2, 'пришел'), (2, 'к'), (2, 'тебе'), (2, 'с'), (2, 'приветом')
select * from @t
is
1Улыбок
2тебе
3дед
4мокар
......


Хотим получить:
is
1Улыбок тебе дед мокар
2Я пришел к тебе с приветом
3Рассказать что солнце встало
5 мар 11, 16:06    [10331081]     Ответить | Цитировать Сообщить модератору
 Re: Аггрегация строк  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11405
Аггггрегаторрр,

FAQ.
5 мар 11, 16:08    [10331087]     Ответить | Цитировать Сообщить модератору
 Re: Аггрегация строк  [new]
bacalavr
Member

Откуда:
Сообщений: 311
Аггггрегаторрр,

select t.i,(select tt.s + ' ' from @t tt where tt.i = t.i for xml path(''))
from @t t
group by t.i
order by t.i
5 мар 11, 16:10    [10331094]     Ответить | Цитировать Сообщить модератору
 Re: Аггрегация строк  [new]
AmKad
Member

Откуда:
Сообщений: 5138
Аггггрегаторрр,

SQL> with s as
  2  (select 1 i, 'Улыбок' str from dual union all
  3   select 2 i, 'тебе'   str from dual union all
  4   select 3 i, 'дед'    str from dual union all
  5   select 4 i, 'Макар'  str from dual
  6  )
  7  select lower(reverse(listagg(str, ' ') within group (order by i))) r
  8  from s;

R
--------------------------------------------------------------------------------
ракам дед ебет кобылу

SQL>
5 мар 11, 16:30    [10331160]     Ответить | Цитировать Сообщить модератору
 Re: Аггрегация строк  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2421
AmKad,

'listagg' is not a recognized built-in function name.
5 мар 11, 17:07    [10331297]     Ответить | Цитировать Сообщить модератору
 Re: Аггрегация строк  [new]
Baddy
Member

Откуда: Харьков
Сообщений: 174
WarAnt
AmKad,

'listagg' is not a recognized built-in function name.


канешна, потому что скуль это не оракл
5 мар 11, 17:13    [10331317]     Ответить | Цитировать Сообщить модератору
 Re: Аггрегация строк  [new]
Аггггрегаторрр
Guest
Ура!!! Получилось!!!
with s as(
	select 1 i, 'Улыбок' s union all
	select 2 i, 'тебе'   s union all
	select 3 i, 'дед'    s union all
	select 4 i, 'Макар'  s
)
select (select lower(reverse(s)) + ' ' from s order by i desc
for xml path(''), type).value('.','varchar(max)')
5 мар 11, 17:15    [10331329]     Ответить | Цитировать Сообщить модератору
 Re: Аггрегация строк  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6719
Baddy,

А тем временем продолжаются набеги варваров на троянских конях ... и как обычно: спички да сахар.
6 мар 11, 04:26    [10333173]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Аггрегация строк  [new]
Veronika_B
Member

Откуда:
Сообщений: 16
1. А такое прокатит на MS 2000?
2. Можете помочь с написанием аналога функции LISTAGG (пробовала с динамическим запросом не получилось)?

Аггггрегаторрр
Ура!!! Получилось!!!
with s as(
	select 1 i, 'Улыбок' s union all
	select 2 i, 'тебе'   s union all
	select 3 i, 'дед'    s union all
	select 4 i, 'Макар'  s
)
select (select lower(reverse(s)) + ' ' from s order by i desc
for xml path(''), type).value('.','varchar(max)')
2 июн 17, 08:05    [20533513]     Ответить | Цитировать Сообщить модератору
 Re: Аггрегация строк  [new]
Добрый Э - Эх
Guest
Veronika_B,

1) На MS SQL Server 2000 не покатит.
2) Читать Ф.А.К.
2 июн 17, 08:19    [20533526]     Ответить | Цитировать Сообщить модератору
 Re: Аггрегация строк  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30711
Veronika_B
1. А такое прокатит на MS 2000?
2. Можете помочь с написанием аналога функции LISTAGG (пробовала с динамическим запросом не получилось)?
1. Нет.
2. А что такое LISTAGG?
2 июн 17, 08:19    [20533528]     Ответить | Цитировать Сообщить модератору
 Re: Аггрегация строк  [new]
Veronika_B
Member

Откуда:
Сообщений: 16
[quot alexeyvg]
Veronika_B
1. А такое прокатит на MS 2000?
2. А что такое LISTAGG?


LISTAGG - это агрегация строк на Oracle
2 июн 17, 08:26    [20533536]     Ответить | Цитировать Сообщить модератору
 Re: Аггрегация строк  [new]
Veronika_B
Member

Откуда:
Сообщений: 16
Добрый Э - Эх
Veronika_B,

1) На MS SQL Server 2000 не покатит.
2) Читать Ф.А.К.


Спасибо
2 июн 17, 08:27    [20533539]     Ответить | Цитировать Сообщить модератору
 Re: Аггрегация строк  [new]
Veronika_B
Member

Откуда:
Сообщений: 16
Veronika_B
Добрый Э - Эх
Veronika_B,

1) На MS SQL Server 2000 не покатит.
2) Читать Ф.А.К.


Спасибо

Можно еще вопрос: В примере в функции идет обработка конкретной таблицы, а можно в параметрах передавать имя таблицы, а в функции делать подстановку.
Пробовала создать функцию с динамическим запросом, оказалось так нельзя.
2 июн 17, 08:53    [20533567]     Ответить | Цитировать Сообщить модератору
 Re: Аггрегация строк  [new]
Добрый Э - Эх
Guest
Veronika_B,

как и в оракле статик-SQL должен быть полностью определен на момент своей компиляции. если нужно передать в качестве параметра имя таблицы или её поля, то только динамика.
если что-то не получилось, то лучше будет показать как пробовала. возможно, просто после оракла сделала неправильно...
2 июн 17, 09:09    [20533598]     Ответить | Цитировать Сообщить модератору
 Re: Аггрегация строк  [new]
Veronika_B
Member

Откуда:
Сообщений: 16
Можете посмотреть мой код на корректность
автор
USE [rda_development_test_data]
GO
SET ANSI_NULLS OFF
GO
SET QUOTED_IDENTIFIER OFF
GO
--Аналог функции LISTAGG на ORACLE
ALTER
--CREATE
FUNCTION CONCAT_STR (@list nvarchar(4000), @sym varchar(2)) RETURNS VARCHAR(4000)
AS
BEGIN
Declare @UserID varchar(100)
declare @str varchar(4000)
declare @sqlstatement nvarchar(4000)
set @sqlstatement = 'Declare users_cursor CURSOR FOR '+@list

exec sp_executesql @sqlstatement
set @str=''

OPEN users_cursor
FETCH NEXT FROM users_cursor
INTO @UserId

WHILE @@FETCH_STATUS = 0
BEGIN
--Print @str
set @str = @str+@UserId
FETCH NEXT FROM users_cursor
INTO @UserId

END
CLOSE users_cursor
DEALLOCATE users_cursor
--print @str

RETURN @str
END
GO


2 июн 17, 09:21    [20533616]     Ответить | Цитировать Сообщить модератору
 Re: Аггрегация строк  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
Veronika_B,

все ораклисты хотят в курсоры :)

DECLARE @a VARCHAR(MAX) = ''
SELECT 
 @a =  CAST(@a as VARCHAR(MAX)) + Column
FROM Table
2 июн 17, 09:33    [20533642]     Ответить | Цитировать Сообщить модератору
 Re: Аггрегация строк  [new]
Veronika_B
Member

Откуда:
Сообщений: 16
TaPaK
Veronika_B,

все ораклисты хотят в курсоры :)

DECLARE @a VARCHAR(MAX) = ''
SELECT 
 @a =  CAST(@a as VARCHAR(MAX)) + Column
FROM Table

Про курсоры это верно.
Спасибо за ликбез(интересное решение).
Но мне нужна универсальная функция, чтобы использовать во вьюхе, то есть параметрами должны быть таблица и условия на нее.
2 июн 17, 09:52    [20533676]     Ответить | Цитировать Сообщить модератору
 Re: Аггрегация строк  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
Veronika_B,

ну и пусть,
@List = 'Column FROM Table WHERE Oracl<>MSSQL '
@SQL = 'SELECT @a = ' + @List

и тд
2 июн 17, 09:54    [20533680]     Ответить | Цитировать Сообщить модератору
 Re: Аггрегация строк  [new]
Veronika_B
Member

Откуда:
Сообщений: 16
TaPaK
Veronika_B,

ну и пусть,
@List = 'Column FROM Table WHERE Oracl<>MSSQL '
@SQL = 'SELECT @a = ' + @List

и тд


я так понимаю, что это будет в теле функции?
Как запустить запрос ( EXEC sp_executesql)?
Но динамику в функции нельзя.
Помогите пожалуйста.
2 июн 17, 10:07    [20533693]     Ответить | Цитировать Сообщить модератору
 Re: Аггрегация строк  [new]
Cammomile
Member

Откуда:
Сообщений: 1212
А опиши всю задачу словами.
2 июн 17, 10:11    [20533701]     Ответить | Цитировать Сообщить модератору
 Re: Аггрегация строк  [new]
Veronika_B
Member

Откуда:
Сообщений: 16
Cammomile
А опиши всю задачу словами.


Во вьюхе надо использовать функцию (аналог LISTAGG oracle).
2 июн 17, 10:21    [20533719]     Ответить | Цитировать Сообщить модератору
 Re: Аггрегация строк  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
Veronika_B
Cammomile
А опиши всю задачу словами.


Во вьюхе надо использовать функцию (аналог LISTAGG oracle).

ну так и напишите в своей вьюхе

SELECT 
	a.Name,
	[Col] = 
	(
		SELECT 
			Name + ' '
		FROM sys.Columns b
		WHERE 
			b.object_id  = a.object_id
		 for xml path(''),type).value('.','varchar(max)'
	) 
FROM sys.Tables a
2 июн 17, 10:27    [20533737]     Ответить | Цитировать Сообщить модератору
 Re: Аггрегация строк  [new]
Veronika_B
Member

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

Мне нельзя использовать for xml path(''), Server 2000
2 июн 17, 10:29    [20533747]     Ответить | Цитировать Сообщить модератору
 Re: Аггрегация строк  [new]
Cammomile
Member

Откуда:
Сообщений: 1212
DECLARE @Str varchar(max) = ''

DECLARE @TTT table ( i int , val varchar(200)) ;

INSERT iNTO @TTT SELECT 1, 'A'
INSERT iNTO @TTT SELECT 2, 'B'
INSERT iNTO @TTT SELECT 3, 'C'

SELECT @Str = @Str + val + ',' FROM @TTT

SELECT @Str
2 июн 17, 10:34    [20533759]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить