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

Откуда:
Сообщений: 109
Кто знает, как в SELECT получить произведение по колонке
с суммой то просто...
declare @Table table(id integer, value float)
insert into @Table( id , value ) values(1,1)
insert into @Table( id , value ) values(1,2)
insert into @Table( id , value ) values(1,3)
insert into @Table( id , value ) values(1,4)
insert into @Table( id , value ) values(2,3)
insert into @Table( id , value ) values(2,4)
insert into @Table( id , value ) values(2,5)


SELECT id, (SUM (value)) SUM
FROM @Table
GROUP BY ID ORDER BY ID
12 окт 07, 14:17    [4787642]     Ответить | Цитировать Сообщить модератору
 Re: есть функция SUM а произведение?  [new]
BusyMan
Member

Откуда: Москва
Сообщений: 4927
хы ) да было бы интересно тоже )

ну можно так в принципе еще:
declare @r float
select @R = 1
SELECT @r =@R * value
FROM @Table 
12 окт 07, 14:21    [4787693]     Ответить | Цитировать Сообщить модератору
 Re: есть функция SUM а произведение?  [new]
iSestrin
Member

Откуда: Новосибирск
Сообщений: 3811
есть старинный красивый способ: select exp(sum(log(value)))
12 окт 07, 14:31    [4787794]     Ответить | Цитировать Сообщить модератору
 Re: есть функция SUM а произведение?  [new]
saint
Member

Откуда: Архангельск
Сообщений: 2262
здесь обсуждалось:
https://www.sql.ru/forum/actualthread.aspx?tid=475964
12 окт 07, 14:35    [4787836]     Ответить | Цитировать Сообщить модератору
 Re: есть функция SUM а произведение?  [new]
VladimirP
Member

Откуда:
Сообщений: 109
СПАСИБО!
12 окт 07, 14:38    [4787859]     Ответить | Цитировать Сообщить модератору
 Re: есть функция SUM а произведение?  [new]
BusyMan
Member

Откуда: Москва
Сообщений: 4927
iSestrin
есть старинный красивый способ: select exp(sum(log(value)))

хм... прикольно ))) такие вещи надо на собеседованиях в качестве вопроса задавать.

а как там с точностью? проблем не бует?
12 окт 07, 16:34    [4788732]     Ответить | Цитировать Сообщить модератору
 Re: есть функция SUM а произведение?  [new]
Кот Матроскин
Member

Откуда: Москва
Сообщений: 8933
iSestrin

есть старинный красивый способ: select exp(sum(log(value)))

Не особо это красивый способ

declare @tt table  ( val float)

insert @tt
select 1.0
union all
select 2.0
union all 
select 0.0


select *
from @tt


select exp(sum(log(val)))
from @tt

12 окт 07, 16:44    [4788796]     Ответить | Цитировать Сообщить модератору
 Re: есть функция SUM а произведение?  [new]
Сталкер
Member

Откуда: Ближний Восток
Сообщений: 102318
BusyMan
iSestrin
есть старинный красивый способ: select exp(sum(log(value)))

хм... прикольно ))) такие вещи надо на собеседованиях в качестве вопроса задавать.

а как там с точностью? проблем не бует?
Я проверил. Округлять надо.
Результат-то во float
Примерно так:
select cast(round(exp(sum(log(value))),10) as decimal(32,10))
ну, или в зависимости от требуемой точности
12 окт 07, 16:48    [4788824]     Ответить | Цитировать Сообщить модератору
 Re: есть функция SUM а произведение?  [new]
Сталкер
Member

Откуда: Ближний Восток
Сообщений: 102318
Кот Матроскин
iSestrin

есть старинный красивый способ: select exp(sum(log(value)))

Не особо это красивый способ

declare @tt table  ( val float)

insert @tt
select 1.0
union all
select 2.0
union all 
select 0.0


select *
from @tt


select exp(sum(log(val)))
from @tt

Красивый способ усложняется
declare @tt table  ( val float)
declare @zero float,@negative float,@positive float

insert @tt
select 1.0
union all
select 2.0
union all 
select 0.0

if exists(select * from @tt where val=0)
set @zero=0.0

select @negative = exp(sum(log(abs(val))))
from @tt
where val<0

select @positive = exp(sum(log(val)))
from @tt
where val>0

select *
from @tt

if exists(select val from @tt where val is not null)
select isnull(@positive,1.0)*isnull(@negative,1.0)*isnull(@zero,1)

-- select exp(sum(log(val)))
-- from @tt


12 окт 07, 17:11    [4788988]     Ответить | Цитировать Сообщить модератору
 Re: есть функция SUM а произведение?  [new]
Кот Матроскин
Member

Откуда: Москва
Сообщений: 8933
2Сталкер
И что, по-Вашему, оно считает правильно? Вы с отрицатльными числами свой скрипт пробовали?

Для правильного результата еще надо подсчитывать количество отрицательных чисел, проверять его на четность... И от красоты остаются рожки да ножки.
12 окт 07, 17:17    [4789019]     Ответить | Цитировать Сообщить модератору
 Re: есть функция SUM а произведение?  [new]
BusyMan
Member

Откуда: Москва
Сообщений: 4927
эхх... а я даже и не заметил что там такие проблемы будут )
12 окт 07, 17:31    [4789112]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: есть функция SUM а произведение?  [new]
sheich
Member

Откуда:
Сообщений: 209
BusyMan

declare @r float
select @R = 1
SELECT @r =@R * value
FROM @Table 

Гениально! То, что надо )))
23 июн 09, 12:11    [7332324]     Ответить | Цитировать Сообщить модератору
 Re: есть функция SUM а произведение?  [new]
нектотам
Guest
select 
	isnull(sum(case when val = 0 then 0 else null end),1) * --zero if zero vals
	(1-2*(sum(case when val < 0 then 1 else 0 end)%2)) * -- sign
	exp(sum(case when val = 0 then 0 when val > 0 then log(val) when val < 0 then log(-val) end)) -- product
from @tt
23 июн 09, 14:00    [7333085]     Ответить | Цитировать Сообщить модератору
 Re: есть функция SUM а произведение?  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
DECLARE @F TABLE(F FLOAT);
INSERT @F(F)
      SELECT 3
--UNION SELECT 0
UNION SELECT -5
UNION SELECT PI()
UNION SELECT -12.44
UNION SELECT 0.000005;

SELECT MIN(ABS(SIGN(F)))*POWER(-1, SUM(SIGN(1-SIGN(1+2*SIGN(F)))))*EXP(SUM(LOG(ABS(ISNULL(NULLIF(F,0),1)))))
FROM @F;
23 июн 09, 14:46    [7333388]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить