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

Откуда: Москва
Сообщений: 826
Нужно получить аналог функции суммирования по полю (SUM) - умножение.

То есть: в таблице задана дата и коэффициент, на который в этот день умножается некая величина. Нужно найти, на какой коэффициент умножится эта величина за заданный период от даты до даты. Вроде задачка красивая, а красивого же решения в голову не приходит. Может чего подскажете?
27 авг 07, 11:28    [4578148]     Ответить | Цитировать Сообщить модератору
 Re: Агрегатная функция умножения  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
>Нужно получить аналог функции суммирования по полю (SUM) - умножение.

произведение можно получить как экспоненту от суммы натуральных логарифмов...

Posted via ActualForum NNTP Server 1.4

27 авг 07, 11:32    [4578190]     Ответить | Цитировать Сообщить модератору
 Re: Агрегатная функция умножения  [new]
avec
Member

Откуда: Москва
Сообщений: 826
Спасибо!
27 авг 07, 11:41    [4578253]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Агрегатная функция умножения  [new]
Шамиль Фаридович
Member

Откуда: Саратов
Сообщений: 487
А что делать, если среди множителей могут встречаться 0, которые как известно не входят в область определения натурального логарифма?
3 июн 13, 17:39    [14385400]     Ответить | Цитировать Сообщить модератору
 Re: Агрегатная функция умножения  [new]
Шамиль Фаридович
Member

Откуда: Саратов
Сообщений: 487
Хотя можно взять
log(sum(exp(ValueWithCorrects)))

Главное, чтобы произведения не было слишком большими, чтобы снова не вылететь
3 июн 13, 17:48    [14385467]     Ответить | Цитировать Сообщить модератору
 Re: Агрегатная функция умножения  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Шамиль Фаридович
Хотя можно взять
log(sum(exp(ValueWithCorrects)))

Взять-то можно, только это не будет произведением ValueWithCorrects.
3 июн 13, 17:50    [14385476]     Ответить | Цитировать Сообщить модератору
 Re: Агрегатная функция умножения  [new]
Шамиль Фаридович
Member

Откуда: Саратов
Сообщений: 487
Вы правы
3 июн 13, 17:53    [14385492]     Ответить | Цитировать Сообщить модератору
 Re: Агрегатная функция умножения  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22550
я честно не знаю зачем это нужно но если уж так понадобилось, то почему бы не CLR

http://technet.microsoft.com/en-us/library/ms131056(v=sql.90).aspx
3 июн 13, 17:59    [14385527]     Ответить | Цитировать Сообщить модератору
 Re: Агрегатная функция умножения  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31960
Паганель
я честно не знаю зачем это нужно но если уж так понадобилось, то почему бы не CLR
ИМХО проще использовать готовый SUM, чем писать на CLR свой агрегат, отдавать его админам на деплой и т.д. :-)
3 июн 13, 19:20    [14385877]     Ответить | Цитировать Сообщить модератору
 Re: Агрегатная функция умножения  [new]
invm
Member

Откуда: Москва
Сообщений: 9833
Шамиль Фаридович
А что делать, если среди множителей могут встречаться 0, которые как известно не входят в область определения натурального логарифма?
Ну так в этом случае и результат 0. В чем тогда проблема?
3 июн 13, 19:57    [14385998]     Ответить | Цитировать Сообщить модератору
 Re: Агрегатная функция умножения  [new]
Гость333
Member

Откуда:
Сообщений: 3683
invm
Шамиль Фаридович
А что делать, если среди множителей могут встречаться 0, которые как известно не входят в область определения натурального логарифма?
Ну так в этом случае и результат 0. В чем тогда проблема?

Имеется в виду такая конструкция
WITH tab(x) AS (SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4)
SELECT EXP(SUM(LOG(x))) AS mult_x
FROM tab
Добавьте в список операндов ноль, и будет invalid floating point operation.
С отрицательными числами -- то же самое.
3 июн 13, 23:42    [14386570]     Ответить | Цитировать Сообщить модератору
 Re: Агрегатная функция умножения  [new]
invm
Member

Откуда: Москва
Сообщений: 9833
Гость333
Добавьте в список операндов ноль, и будет invalid floating point operation.
С отрицательными числами -- то же самое.
Это как раз понятно, но обходится же элементарно:
declare @t table (i int);

insert into @t
values
 (1), (2), (3), (4), (5)--, (0);
 
select
 exp(sum(log(case when i <> 0 then abs(i) end))) *
  case when count(case when i = 0 then i end) > 0 then 0 else 1 end *
  case when count(case when i < 0 then i end) % 2 = 0 then 1 else -1 end
from
 @t;
4 июн 13, 00:24    [14386692]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить