为什么这些总和不同?

时间:2011-05-17 16:23:26

标签: sql-server sql-server-2005 tsql

我有一个看起来像这样的表:

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)和AND Hours > 0.0(一个DECIMAL)?当我在where语句中执行此操作时,是否存在隐式CAST?

3 个答案:

答案 0 :(得分:3)

你必须有一些负面的时间。

答案 1 :(得分:3)

如果在排除某些记录时总和较大,则必须排除负数。

请记住,自1 + (-1) + 2 == 1 - 1 + 2以来,[1,-1,2]的总和为2。

正如您所指出的,如果结束日期和开始日期不正确,那么您也可以排除您打算包含的记录。这可能会导致总和大于或等于预期。

答案 2 :(得分:1)

您正在处理实时数据吗?即使有学生负数小时,当你添加另一个条件(小时> 0)时,不同的学生数应该减少

好的,我拒绝了您的评论而不是数据。第二个结果小于第一个结果。