умножить строки в т-sql - PullRequest
       14

умножить строки в т-sql

16 голосов
/ 18 ноября 2011

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

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

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

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

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

Ответы [ 3 ]

26 голосов
/ 18 ноября 2011
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

РЕДАКТИРОВАТЬ: Добавлен тестовый скрипт

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
1 голос
/ 18 ноября 2011
select id, power(sum(log10(num)),10) group by id
1 голос
/ 18 ноября 2011

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


Редактировать: @mellamokb Это аналог конкатенации, но требует некоторой модификации.Пример сценария будет выглядеть следующим образом:

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...