Умножать строки в 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