2014-01-15 136 views
0

我正在寫一個查詢,是SQL Server中存儲過程的一部分。我需要在SQL Server中找到累積和。SQL Server累積求和

變量將保存整數值,如100。比方說,

Declare @Variable int = 100 

現在@NewVariable將有以下公式:

@NewVariable = @Variable * (1 - 0.005) 

因此@NewVariable = 99.5

現在,@NewestVariable將有以下公式;

@NewestVariable = @NewVariable * (1 - 0.005)  

因此,@NewestVariable將具有99.00

值同樣地該計算將出現24次,所有的結果將是在末端和。

因此最終結果將是:100 + 99.5 99.00 + .... ...

我試圖實現使用@count變量(DECLARE @COUNT INT = 24),並使用一個While循環所期望的結果,但我我不確定我是否正確?

請求您的幫助!

謝謝!

+0

請分享您嘗試過的代碼。此外,它看起來像一個簡單的數學問題 - 不是嗎?一系列的總和? –

+0

除非您顯示您的實際代碼,否則很難判斷它是否正確 – user1455836

+0

@SuyashKhandwe:是這是系列 –

回答

1

試試這個代碼。

declare @Variable decimal(20,10); 
set @Variable = 100; 

declare @Sum decimal(20,10); 
set @Sum = 0; 

declare @cnt int; 
set @cnt = 1; 

while (@cnt <= 24) 
begin 
    set @Sum = @Sum + @Variable; 
    set @Variable = @Variable * (1.0 - 0.005); 
    set @cnt = @cnt + 1; 
end; 

select @Sum; 
+0

是你的肯定這是錯的? - 'DECLARE @Variable INT = 100' **嘗試此方法 - ** 'DECLARE @Variable INT = 100 SELECT @ Variable' –

+0

@SuyashKhandwe我刪除那部分,我錯了,它是錯的;) –

+0

Downvote是關於語法的錯誤信息 - 你恢復了 - 我恢復了。 –

1

一個簡單的答案會是這樣

DECLARE @Variable INT = 100 
SELECT @Variable 
DECLARE @counter INT = 1 
DECLARE @SumVariable NUMERIC(20,2) = @Variable 
DECLARE @NewVariable NUMERIC(20,2) = @Variable 

WHILE(@counter<24) 
BEGIN 
    SET @NewVariable = @NewVariable * 0.995 
    SET @SumVariable = @SumVariable + @NewVariable 
    SET @counter = @counter+1 
END 
SELECT @SumVariable 
+0

我認爲這將執行23次,而不是24次。 –

+0

沒有23應該給你正確的結果,因爲sum變量從變量本身的值開始 –

+0

好吧。這是不正確的順便說一句:(1.995)。 –

2

您可以按照以下方法使用CTE做到這一點:

declare @variable int = 100 
;with cte as 
(
select convert(numeric(8,2), @variable) as var, 1 as recCount 
union all 
select convert(numeric(8,2), @variable * (1 - recCount*0.005)) as var, recCount+1 as recCount 
from cte 
where recCount < 24 
) 
select sum(var) as total from cte 

Working Fiddle Demo

編輯:調整來解決舍入錯誤根據@ peter.petrov的評論

如果需要計數之前得到每一行的值,請使用this fiddle

+0

我認爲這給了太多的舍入誤差。不知道它是否重要。 –

+0

@ peter.petrov:感謝您的評論,我調整了解決舍入問題。 – Kaf

+0

其實重讀這個問題也許這就是OP所需要的,因爲他寫道:100 + 99.5 + 99.00。無論如何。 –

1

你也可以使用一個"quirky update"避免while循環。如果您不介意中間調用,只需修改最後一行代碼即可只選擇max(total)

DECLARE @total DECIMAL(10,3) = 0.000 

;WITH "data" AS 
(
    SELECT CAST(100 AS DECIMAL(10,3)) AS id 
    UNION ALL 
    SELECT CAST(id * (1 - 0.005) AS DECIMAL(10,3)) FROM "data" WHERE id > 100 * (1 - 21 * 0.005) 
) 
SELECT 
    id, total = CAST(0.000 AS DECIMAL(10,3)) 
INTO #temp 
FROM 
    "data" 
OPTION (MAXRECURSION 23); 

UPDATE t SET @total = total = @total + id FROM #temp t 

SELECT * FROM #temp 

查看SQL-Fiddle進行測試。