我有一个看起来像这样的表:
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?
答案 0 :(得分:3)
你必须有一些负面的时间。
答案 1 :(得分:3)
如果在排除某些记录时总和较大,则必须排除负数。
请记住,自1 + (-1) + 2 == 1 - 1 + 2
以来,[1,-1,2]的总和为2。
正如您所指出的,如果结束日期和开始日期不正确,那么您也可以排除您打算包含的记录。这可能会导致总和大于或等于预期。
答案 2 :(得分:1)
您正在处理实时数据吗?即使有学生负数小时,当你添加另一个条件(小时> 0)时,不同的学生数应该减少
好的,我拒绝了您的评论而不是数据。第二个结果小于第一个结果。