Умножать строки в t-sql

У меня есть следующая таблица

 ID     Number    
----------------     
   1       41.5
   2       42.5
   3       43.5
   2       44.5   
   2       45.5
   1       46.5
   1       47.5

Мне нужно написать запрос, который будет возвращать разные идентификаторы и соответствующие значения столбцов номера. Для данной таблицы результат должен быть таким:

ID       Result 
-----------------
  1         41.5 * 46.5 * 47.5
  2         42.5 * 44.5 * 45.5
  3         etc...

(без использования курсоров)

Ответы

Ответ 1

SELECT Id, EXP(SUM(LOG(Number))) as Result
FROM Scores 
GROUP BY id

Это будет работать для положительных чисел, чтобы умножить отрицательные числа, вы можете использовать функцию ABS() для использования абсолютного (положительного) значения, но конечный результат будет положительным, а не отрицательным числом:

SELECT Id, EXP(SUM(LOG(ABS(Number)))) as Result
FROM Scores 
GROUP BY id

EDIT: добавлен тест script

DECLARE @data TABLE(id int, number float)

INSERT INTO @data VALUES
(1, 2.2),
(1, 10),
(2, -5.5),
(2, 10)

SELECT Id, EXP(SUM(LOG(ABS(Number)))) as Result 
FROM @data GROUP BY id 

Вывод:

1   22
2   55

Ответ 2

Это небольшое изменение в конкатенации строк, и у Джеффа Модена есть отличная статья об этом в SQL Server Central под названием Настройка производительности: функции конкатенации и некоторые мифы настройки


Изменить: @mellamokb Это аналогично конкатенации, но требует некоторой модификации. Образец script будет

create table testMult (id int, num int)

GO

insert into testMult values (1, 2)
insert into testMult values (1, 3)
insert into testMult values (1, 4)
insert into testMult values (2, 2)

GO

create function dbo.fnMult (@someId int)
returns int as 
begin
    declare @return int
    set @return = 1

    select @return = @return * num
    from testMult
    where id = @someId

    return @return
end

GO

select * 
from testMult

select t1.id,
    dbo.fnMult(t1.id) 
from testMult t1
group by t1.id

Это всего лишь небольшая вариация на script, предоставленная Джеффом Моденом в его статье.

Ответ 3

select id, power(sum(log10(num)),10) group by id