2012-10-29 34 views
0

在以下while循環中,從表中添加所選值時,變量@total的結果爲NULL。如果不添加,結果將顯示爲表格中的選定值,但僅顯示最後一行的值。在循環中無法將值增加到Sql中的變量

SET @coundDate = '1/1/2012'; 

WHILE (Datepart(dd, @countDate) < Datepart(dd, @endDate)) 
    BEGIN 
     SET @total = @total + (SELECT Cast([7am] AS INT) + 
            Cast([8am]AS INT) AS TotalHitCount 
          FROM Sale 
          WHERE TransactionDate = @countDate); 
     SET @countDate = Dateadd(d, 1, @countDate); 
    END; 

SELECT @total 

我現在混淆了很多。那是什麼錯誤?

+1

你爲什麼要做這個循環。 「SUM」不會爲你工作嗎? –

+0

如何在這種情況下「分組」? –

+0

從您顯示的代碼中,您不需要'group by'。只需選擇「where」即可選擇感興趣的行。 –

回答

1

正如馬丁指出,你可以寫你的整個查詢作爲一個簡單的SUM

SELECT SUM(Cast([7am] AS INT) + Cast([8am]AS INT)) AS Total 
FROM Sale 
WHERE TransactionDate between '20120101' and @endDate 

雖然我查詢爲什麼7am8am還不是int s。

+1

可能更安全地執行SUM(ISNULL(Cast([7am] AS INT),0)+ ISNULL(Cast([8am] AS INT),0))AS Total。他們可能獲得原始行爲的原因之一是,如果其中一個值爲「NULL」,並且這將失去非空值。 –

1

你要預初始化你的變量的默認值爲0一樣:)

+0

我已經預先初始化了這個變量。 –

+2

@NayLinAung - 你沒有在你顯示的代碼中初始化@ @ total(儘管你顯示的代碼顯然不是你真正的代碼) –

+0

@Damien_The_Unbeliever - 如果你不能幫助,請不要'無用的假設。這是我的BIT項目業務活動監控系統中的真實代碼。我如何顯示代碼的每一部分?我只發佈了發生錯誤的部分代碼。 –