2011-05-17 26 views
1

我有一個表,看起來像這樣:爲什麼這些合計金額不同?

CREATE TABLE [dbo].[StudentTime] 
([StudentTimeID] [int] NOT NULL IDENTITY(164352, 1), 
[StudentID] [int] NOT NULL, 
--Some columns... 
[EntryDateTime] [datetime] NOT NULL, 
[Hours] [decimal] (6, 2) NOT NULL CONSTRAINT [DF_StudentTime_Hours] DEFAULT ((0)) 
--Some more columns 
) 

當我查詢它

SELECT COUNT(DISTINCT StudentID) AS StudentCount, 
SUM(HOURS) AS TotalHours 
FROM dbo.StudentTime 
WHERE EntryDateTime >= '5/1/2010' 
AND EntryDateTime < '5/1/2011' 

我得到這樣的結果:

StudentCount: 9890 
TotalHours: 775645.5 

現在我想篩選學生出的無論出於何種原因,在該報告期內累計0小時的人數:

SELECT COUNT(DISTINCT StudentID) AS StudentCount, 
SUM(HOURS) AS TotalHours 
FROM dbo.StudentTime 
WHERE EntryDateTime >= '5/1/2010' 
AND EntryDateTime < '5/1/2011' 
AND Hours > 0 

我得到這樣的結果:

StudentCount: 9792 --Expected to be smaller. 
TotalHours: 775699.25 --Expected to be same, but is larger?!?! 

是不是因爲我有AND Hours > 0(一個int)VS AND Hours > 0.0(一個十進制)?當我這樣做時,有沒有一個隱含的CAST正在進行?

+5

查詢的結果是什麼:'SELECT COUNT(*)FROM StudentTime WHERE Hours <0'? – CodeNaked 2011-05-17 16:27:03

+0

34個記錄。我想知道那是不是?沒有限制,說EntryDateTime必須大於ExitDateTime(未顯示),無論是在應用程序代碼還是數據庫中。 – NateMpls 2011-05-17 16:31:02

+2

Bingo,CodeNaked,負數小時的總和是-54左右。如果您發佈答案,我會接受。 :-) 謝謝! – NateMpls 2011-05-17 16:33:39

回答

3

如果排除某些記錄時總和較大,則必須排除負數。

請記住,自[1 + (-1) + 2 == 1 - 1 + 2開始[1,-1,2]的總和爲2。

正如您所指出的那樣,如果結束日期和開始日期不正確,那麼您也可以排除您希望包含的記錄。這可能會導致比預期更大或更小的總和。

3

你必須有一些消極的時間。

1

你正在處理實時數據嗎?即使有學生負小時,當你添加另一個條件(小時> 0)時,不同學生的人數應該已經減少。

好的,我爲你的評論而不是數據而倒下了。第二個結果比第一個小。

+0

這就是爲什麼我添加了這個條件。您可以在0小時的時間內在該表中存儲註釋。我不想總算這些學生的總數。我沒有預料到存在負面時間條目及其查詢的影響。 – NateMpls 2011-05-17 16:44:15