Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Агрегтрование строк  [new]
Агрегтрование строк
Guest
Есть таблица : TBL ,колонки COL1 int и СOL2 varchar(50)
Данные :
COL1 COL2
1 Вася Пупкин
1 крутой чел.
2 Петя Петров
2 тоже крут.

Как написать запрос не используя курсор (важно чтобы это работало быстро),чтобы сгруппировать данные из
таблицы TBL по полю COL1 и произвести агрегирование данных в COL2 (надо конкатенировать их). Должно получится что то вроде

COL1 COL2
1 Вася Пупкин крутой чел.
2 Петя Петров тоже крут.

Может есть какие стандартные агрегативные ф-ии типа SUM() , но только для
строк? Может кто идею подаст .... Спасиб ..
9 дек 04, 10:47    [1168967]     Ответить | Цитировать Сообщить модератору
 Re: Агрегтрование строк  [new]
Smirnov Anton
Member

Откуда: Н.Новгород
Сообщений: 3220
стандартных нет, но вы можете написать свою UDF, типа F1(@colid int)
а потом
select col1, F1(col1)
from TBL
group by col1

PS работать будет не супер быстро
9 дек 04, 10:51    [1168989]     Ответить | Цитировать Сообщить модератору
 Re: Агрегтрование строк  [new]
Glory
Member

Откуда:
Сообщений: 104760
Может кто идею подаст .... Спасиб ..
Есть идея почитать FAQ
9 дек 04, 10:51    [1168990]     Ответить | Цитировать Сообщить модератору
 Re: Агрегтрование строк  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
FAQ
9 дек 04, 10:52    [1168991]     Ответить | Цитировать Сообщить модератору
 Re: Агрегтрование строк  [new]
Агрегтрование строк
Guest
ОЧЕНЬ МЕДЛЕНО !!!
Позор MSSQL - такие то вещи не реализовать !?
Ведь MAX() MIN() для строк работает, почему бы и SUM() не сделать ???
Обленились видимо
9 дек 04, 12:45    [1169598]     Ответить | Цитировать Сообщить модератору
 Re: Агрегтрование строк  [new]
Smirnov Anton
Member

Откуда: Н.Новгород
Сообщений: 3220
подождите юкон и там пишите свои, какие надо
9 дек 04, 12:46    [1169607]     Ответить | Цитировать Сообщить модератору
 Re: Агрегтрование строк  [new]
Secret
Member

Откуда: Moscow
Сообщений: 72
select t1.id,t1.Text + ' '+ t2.Text s from tword t1 join tword t2 on t1.ID=t2.ID and t1.text<t2.text

где id - вместо COL1, Text вместо COL2
9 дек 04, 13:30    [1169864]     Ответить | Цитировать Сообщить модератору
 Re: Агрегтрование строк  [new]
Smirnov Anton
Member

Откуда: Н.Новгород
Сообщений: 3220
Secret
select t1.id,t1.Text + ' '+ t2.Text s from tword t1 join tword t2 on t1.ID=t2.ID and t1.text<t2.text

где id - вместо COL1, Text вместо COL2

да, тока для ограниченного числа строк и выделенное условие ничего не даёт,
вот если вставить в эту таблицу identity, который идёт в том порядке, в котором надо конкатенировать - тогда для определённого(не больше макс числа соединяемых таблиц) числа конкатенаций можно применить
и еще использовать left и isnull(text,'')
9 дек 04, 13:38    [1169913]     Ответить | Цитировать Сообщить модератору
 Re: Агрегтрование строк  [new]
Secret
Member

Откуда: Moscow
Сообщений: 72
t1.text<t2.text исключает повторы с разным поряком
9 дек 04, 13:41    [1169934]     Ответить | Цитировать Сообщить модератору
 Re: Агрегтрование строк  [new]
Smirnov Anton
Member

Откуда: Н.Новгород
Сообщений: 3220
я вот про что
1 - ваш вариант не даёт определённого порядка конкатенации
2 - ваш вариант не будет раболать при конкатенации одинаковых строк
9 дек 04, 13:43    [1169953]     Ответить | Цитировать Сообщить модератору
 Re: Агрегтрование строк  [new]
Secret
Member

Откуда: Moscow
Сообщений: 72
для задания порядка нужна дополнительная информация,
одинаковые строки соединять - а зачем?
9 дек 04, 13:52    [1170001]     Ответить | Цитировать Сообщить модератору
 Re: Агрегтрование строк  [new]
Smirnov Anton
Member

Откуда: Н.Новгород
Сообщений: 3220
автор
для задания порядка нужна дополнительная информация

а я про что
Smirnov Anton
вот если вставить в эту таблицу identity, который идёт в том порядке, в котором надо конкатенировать

а одинаковы строки конкатенировать тоже может потребоваться
9 дек 04, 13:55    [1170019]     Ответить | Цитировать Сообщить модератору
 Re: Агрегтрование строк  [new]
Secret
Member

Откуда: Moscow
Сообщений: 72
identity неудобен, т.к. зависит от порядка добавления строк в таблицу
больше подойдет порядок фразы в предложении, как в английском:
подлежащее - 1, сказуемое - 2, дополнение - 3 и т.д.
9 дек 04, 14:10    [1170120]     Ответить | Цитировать Сообщить модератору
 Re: Агрегтрование строк  [new]
Glory
Member

Откуда:
Сообщений: 104760
Secret
identity неудобен, т.к. зависит от порядка добавления строк в таблицу
больше подойдет порядок фразы в предложении, как в английском:
подлежащее - 1, сказуемое - 2, дополнение - 3 и т.д.

Хм. А ваш запрос сработает для

COL1 COL2
1 Вася Пупкин
1 крутой чел.
1 Ну очень крутой.
9 дек 04, 14:16    [1170166]     Ответить | Цитировать Сообщить модератору
 Re: Агрегтрование строк  [new]
Агрегтрование строк
Guest
Secret
select t1.id,t1.Text + ' '+ t2.Text s from tword t1 join tword t2 on t1.ID=t2.ID and t1.text<t2.text

где id - вместо COL1, Text вместо COL2


Дает только все возможные вариаты конкатенации строк, так если надо было сконкатенировать несколько строк более 2-х (наприм 3) то результатом были бы обычные сочетания кокат-й 1 со 2 й, 1 с 3 й, 2 с 3 й ( 3 записи) - этот результат не нужен !
Надо всего то всех их трех сложить в одну запись !
9 дек 04, 14:20    [1170205]     Ответить | Цитировать Сообщить модератору
 Re: Агрегтрование строк  [new]
Secret
Member

Откуда: Moscow
Сообщений: 72
соединение произвольного числа строк - задача клиента, а не сервера
9 дек 04, 14:39    [1170363]     Ответить | Цитировать Сообщить модератору
 Re: Агрегтрование строк  [new]
Glory
Member

Откуда:
Сообщений: 104760
Secret
соединение произвольного числа строк - задача клиента, а не сервера

Гы. Тогда зачем вообще соединять в вашем запросе таблицу с собой же ?
Может просто вернуть клиенту набор записей.
9 дек 04, 14:47    [1170428]     Ответить | Цитировать Сообщить модератору
 Агрегтрование строк  [new]
Агрегтрование строк
Guest
Glory
Может кто идею подаст .... Спасиб ..
Есть идея почитать FAQ


Приведенный в FAQ способ для меня ,к сожалению, оказался негоден :)
Минус этого способа ,то что он требует права на создание таблиц,а если прав нет (что должно быть фактически у каждого пользователя) ,то он вообще не применим!

С временными таблицами типа ##Table - где проблемы прав нету , реализовать тоже не удается т.к. из функции нельзя обратиться к таким табдицам.
9 дек 04, 15:38    [1170764]     Ответить | Цитировать Сообщить модератору
 Re: Агрегтрование строк  [new]
Glory
Member

Откуда:
Сообщений: 104760
Минус этого способа ,то что он требует права на создание таблиц,а если прав нет (что должно быть фактически у каждого пользователя) ,то он вообще не применим!
Чего чего ? Создаваемые в примере таблицы есть эмуляция исходных данных.
Нельзя же написать работающий запрос чтобы он брал данные из ниоткуда ?
9 дек 04, 15:44    [1170799]     Ответить | Цитировать Сообщить модератору
 Re: Агрегтрование строк  [new]
Агрегтрование строк
Guest
Прошу прощения ,не правильно выразился ,может так:
У меня данные качаюся со многих таблиц JOIN - ми ,совсем не так примитивно как в примере, поэтому целисообразно закачать все в одну временную таблицу , а там уже группировать - так будет много быстрее..

И тут появляются проблемы: в примере всё завязано на функции,а она
не может использовать врем табл типа ##Table, а на другие права нужны ...
9 дек 04, 15:59    [1170883]     Ответить | Цитировать Сообщить модератору
 Re: Агрегтрование строк  [new]
Korefan
Guest
может подскажите, как переписать эту функцию, что бы она агрегировала две строки? На данный момент она возвращает только @max.
CREATE FUNCTION stock_card_price3 ( @id_currency int, @date DateTime, @Code char(20))
RETURNS NVARCHAR(100) AS
BEGIN
DECLARE @ex_rate money
DECLARE @min char(20)
DECLARE @max char(20)
DECLARE @result NVARCHAR(100)
DECLARE @is_default bit
set @ex_rate = null
set @is_default = (select is_default from cp_currency where id = @id_currency)
if @is_default = 1 begin

set @max = (select convert(char(20),max(price1)) from cp_stock_card where code like rtrim(@Code)+'*%')

set @min = (select convert(char(20),min(price1)) from cp_stock_card where code like rtrim(@Code)+'*%')
set @result = @min+' '+@max
end
else
begin
set @ex_rate = (select rate from cp_currency_exchange_rate where id_currency=@id_currency and rate_date = @date)
set @max = (select convert(char(20),(max(price1)/@ex_rate)) from cp_stock_card where code like rtrim(@Code)+'*%')
set @min = (select convert(char(20),(min(price1)/@ex_rate)) from cp_stock_card where code like rtrim(@Code)+'*%')
set @result = @min+' '+@max
end

return @result
END
10 авг 05, 19:48    [1775699]     Ответить | Цитировать Сообщить модератору
 Re: Агрегтрование строк  [new]
Glory
Member

Откуда:
Сообщений: 104760
На данный момент она возвращает только @max.
Может быть в вашу переменную @min ничего не заносится ?
10 авг 05, 20:44    [1775783]     Ответить | Цитировать Сообщить модератору
 Re: Агрегтрование строк  [new]
Korefan
Guest
Заноситься в обе. А возвращает только то, что стоит левее перед знаком сложения. То есть @max+@mix = вернет @max.
11 авг 05, 12:23    [1777404]     Ответить | Цитировать Сообщить модератору
 Re: Агрегтрование строк  [new]
Glory
Member

Откуда:
Сообщений: 104760
Korefan
Заноситься в обе. А возвращает только то, что стоит левее перед знаком сложения. То есть @max+@mix = вернет @max.

1. Как вы проверяли что заносится в переменные

2. Чудес не бывает. Возвращается тот результат, который получается из @max+@mix .
11 авг 05, 12:27    [1777434]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить