如何查找运行乘法

时间:2015-02-09 12:30:34

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

不确定这是正确的标题。我需要找到cumulative multiplication就像跑步一样。

搜索论坛并获得了很好的answer。但这不是我的确切答案。

如此修改了我的要求的答案。

SELECT *,
       (SELECT CASE
                 WHEN Min(Abs(Column1)) = 0 THEN 0
                 ELSE Exp(Sum(Log(Abs(NULLIF(Column1, 0))))) -- the base mathematics
                      * Round(0.5 - Count(NULLIF(Sign(Sign(Column1) + 0.5), 1))%2, 0) -- pairs up negatives
               END
        FROM   TEMP a
        WHERE  B.ID >= A.ID) as  Running_Mul
FROM   TEMP B 

我得到了答案。现在有没有更好的方法在Sql Server 2008中执行此操作?

示例数据:

ID  Column1 
--  -------
1   1       
2   2       
3   4       
4   8       
5   -2  

预期结果:

ID  Column1 Running_Mul
--  ------- -----------
1   1       1
2   2       2
3   4       8
4   8       64
5   -2      -128

Sql Fiddle

2 个答案:

答案 0 :(得分:1)

你的方法非常合理。顺便说一句,nullif()中的sum()很好。虽然仅在else之后计算then子句 ,但在聚合期间计算else的组件 - 因此log(0)将返回错误。

我认为有一些更简单的方法来计算符号,例如:

power(-1, sum(case when column1 < 0 then 1 else 0 end))

或:

(case when sum(case when column1 < 0 then 1 else 0 end) % 2 = 0 then 1 else -1 end)

然而,哪个版本更简单&#34;是一个意见问题。

答案 1 :(得分:1)

这是我在SP中使用的另一种方法:

USE DB
GO

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
GO

IF(OBJECT_ID('TEMP') IS NOT NULL)
DROP TABLE TEMP

CREATE TABLE TEMP (ID INT, Column1 INT)
INSERT INTO TEMP VALUES
(1,1), 
(2,2), 
(3,4), 
(4,8), 
(5,-2)  

DECLARE @result TABLE(ID INT, Column1 INT, calc INT)
DECLARE @Calc INT = 1

INSERT INTO @result (ID,Column1)
SELECT ID,Column1 FROM TEMP ORDER BY ID

UPDATE @result SET @Calc = calc = Column1 * @Calc

SELECT * FROM @result

我找到了一个博客,其中比较了解决此类问题的不同方法。检查here