2015-02-09 48 views
3

不知道這是正確的標題。我需要找到像運行總數一樣的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

+0

http://mangalpardeshi.blogspot.in/2009/06/multiplying-column-values.html – mohan111 2015-02-09 12:42:12

回答

1

你的方法是相當合理的。順便提一下sum()中的nullif()。雖然else子句,但只在then之後計算,其他部分在聚合期間計算 - 因此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) 

然而,版本是「簡單」是見仁見智。

+0

可以在我的查詢失敗時共享示例。我沒有得到你想說的對不起。 – 2015-02-09 13:12:07

+0

@NoDisplayName。 。 。你的版本不會失敗。對不起,我沒有說清楚這一點。在'case'語句中需要'nullif()',儘管文檔說這些子句是按順序評估的。 – 2015-02-09 21:45:11

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

+0

謝謝你的時間花花公子:) – 2015-02-11 09:13:08

+0

在那個鏈接裏提到**注意:使用「更新到局部變量」方法有一個很大的假設。這就是Update語句將按照正確的順序更新臨時表中的行。沒有簡單的方法來指定Update語句的順序,所以這種方法可能會失敗,儘管我還沒有看到它實際發生了!** – 2015-02-11 09:20:58

+0

是!確實如此。如果以某種方式更新沒有按照正確的順序進行,它不會給出期望的結果,但我還沒有看到這種情況。這裏是類似的問題和答案,說明相同:http://stackoverflow.com/questions/11310877/calculate-running-total-running-balance – 2015-02-12 05:35:11