Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 选择与多个时间相关的不同记录_Sql_Sql Server 2008 - Fatal编程技术网

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好吧,除非从所有分组行中选择最小或最大日期,否则不能这样做。