Sql 选择与多个时间相关的不同记录
我有一个包含员工奖励历史的数据库,这样将来我们可以计算出有多少奖励授予了特定的员工。我还有一个专栏,其中包含了员工在上班时没有穿漂亮衣服的次数信息,这与日期有关。我想计算一下授予每位员工的奖励数量,员工不穿公司制服的次数。当前我的数据库看起来:Sql 选择与多个时间相关的不同记录,sql,sql-server-2008,Sql,Sql Server 2008,我有一个包含员工奖励历史的数据库,这样将来我们可以计算出有多少奖励授予了特定的员工。我还有一个专栏,其中包含了员工在上班时没有穿漂亮衣服的次数信息,这与日期有关。我想计算一下授予每位员工的奖励数量,员工不穿公司制服的次数。当前我的数据库看起来: ID fName sName awards smart date 1 jack Mack 1 0 2014-05-06 2 Jimmy Jack
ID fName sName awards smart date
1 jack Mack 1 0 2014-05-06
2 Jimmy Jack 0 1 2014-04-06
3 Jack Mack 1 1 2014-05-04
4 Jack Mack 1 0 2014-02-03
5 Jimmy Jack 0 1 2014-05-01
基于上表,我创建了另一个表,该表应该只有一个记录条目,例如
ID fName sName awards smart date
1 jack Mack 3 1 2014-05-06
2 Jimmy Jack 0 2 2014-04-06
但这里的问题是日期,杰克在不同的日子里获得了3个奖项。将来,如果我需要在两个日期之间选择记录,那么我将如何进行并执行此操作,因为在我的表中,我已删除了重复的记录,而SQL所做的是,它将取最早的日期并使用它。
如果我计算第一个表中重复记录的1的数量,我会得到错误的数据,我的查询是:
select ID, fName, sName, awards, smart, date,
count(case awards when 1 then 1 else null end)
from tablename
group by ID, fName, sName, awards, smart, date
再次接收错误数据的原因是时间?有没有办法解决这个问题
select min(id), fName, sName,
sum(awards) as awards,
sum(smart) as smart, min(date) as date
from the_table
group by fName, sName
更新尝试使用sumNULLIFsmart,0当您对记录进行分组(例如获取总计等)时,只返回可用于分组的列是有意义的。这意味着只有作为组计算基础的列。在您的情况下,只有fName和sName用于分组,因为您正在为唯一的员工分组 旁注:在这个查询中,您应该为您的员工提供某种唯一的标识符,因为姓名不一定是唯一的 因此,您应该只在group by中包含这些列。您可以使用sum函数获取奖励和smart的数量,因为它们的值分别为0和1
select fName, sName,
sum(convert(int, awards)) as awards,
sum(convert(int, smart)) as smart,
max([date]) as maxdate
from tablename
group by fName, sName
见此,我只添加了相关列。您使用的是哪个数据库系统?如果有多个日期,为什么输出中需要一个日期?@Szymon我使用的是Microsoft server management 2008,我需要日期,因为在我的web表单中,我也显示了日期,而且在我的一些查询中,我获取了两个日期之间的记录。使用sum,我得到一个错误:操作数数据类型位对于sum运算符无效。我正在使用服务器2008@User911不知道列类型。我更新了我的答案,现在就试试吧。它可以工作,但它不等于奖励的总和,它只在记录旁边显示1或0。奖励列的返回类型为位。加上我怎样才能把日期带进来。我想在网页上显示日期,这样对我很有效,但一旦我输入日期,它就停止工作了!为什么呢?我需要日期,这样我就可以显示两个日期之间的奖励数量。@User911好吧,除非从所有分组行中选择最小或最大日期,否则不能这样做。