乘以t-sql中的行

时间:2011-11-18 16:48:28

标签: sql sql-server sql-server-2008 tsql

我有下表

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

我需要编写一个查询,它将返回不同的ID和相应的Number列值相乘。对于给定的表,结果应该是这样的

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

(不使用游标)

3 个答案:

答案 0 :(得分:26)

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 :(得分:1)

这是行连接的一个细微变化,Jeff Moden在SQL Server Central上有一篇很好的文章标题为Performance Tuning: Concatenation Functions and Some Tuning Myths


编辑:@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

这只是Jeff Moden在他的文章中提供的一个非常小的变体。

答案 2 :(得分:1)

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