Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Функции агрегирования для строк в SQL


Wild ©   (2002-05-23 16:22:00) 

такая фигня

есть две таблицы

T1
=====
ID
....

и

T2
====
ID
T1_ID
Value

Мне, например, надо узнать какие T2.Value относятся к каждой записи в T1

select T1.ID, T2.Value from T1,T2 where T2.T1_ID=T1.ID

Ну он мне типа выдаст:

ID Value
==== ========
1 1
1 2
1 3
2 1
2 2
3 3

А вот можно вот что бы так:
ID Value
==== ========
1 1,2,3
2 1,2
3 3


sniknik   (2002-05-23 18:42:00) [1]

аналог для MSSQL

CREATE function GetStr (@id int)
RETURNS varchar (8000)
AS
BEGIN
DECLARE @Ret varchar (8000)
DECLARE @S varchar (8000)
DECLARE CountCur CURSOR FOR
SELECT CAST(PRICERUB AS varchar (8)) FROM CASHSAIL WHERE [Id] = @id
OPEN CountCur
FETCH NEXT FROM CountCur INTO @Ret
WHILE @@FETCH_STATUS = 0
BEGIN
FETCH NEXT FROM CountCur INTO @S
SET @Ret= @Ret + "," + @S
END
CLOSE CountCur
DEALLOCATE CountCur
RETURN @Ret
END

select [id], dbo.GetStr([id]) from cashsail
order by [id]


xGrey   (2002-05-23 17:55:00) [2]

Для Oracle - рбочая, проверял. Там так можно организовать курсорный цикл и неявно инициализировать переменную курсорного цикла.


Johnmen   (2002-05-23 17:46:00) [3]

>xGrey ©
Ты уверен, что конструкция рабочая ?
for r in (select value from t2 where t2.T1_ID=inT1_id)

я бы сначала проверил... :)


Johnmen   (2002-05-23 17:41:00) [4]

А вот так чтобы так - НЕЛЬЗЯ...


xGrey   (2002-05-23 17:40:00) [5]

Если я правильно понял вопрос, то то,что Вы назаваете "ф-цией агрегирования строк" придется писать самому. Примерный вариант на Oracle:

function GetStr(inT1_id in integer) return varchar2 as
s varchar2(10000);
begin
for r in
(select value from t2 where t2.T1_ID=inT1_id)
loop
s:=s||to_char(r.value)||",";
end loop;
return s;
end;

Вызов:
select t1.id, GetStr(t1.ID) from t1
order by t1.id


Наверх

Титульная страница Поиск, карта сайта Написать письмо