选择具有多个时间相关的不同记录

时间:2014-05-06 12:52:42

标签: sql sql-server-2008

我有一个包含员工授予历史记录的数据库,因此将来我们可以计算出给特定员工颁发的奖项数量。我还有另一个专栏,其中包含有关员工没有穿着智能衣服上班的次数的信息。我想计算每个员工的奖励数量,以及员工未穿公司制服的时间。目前我的数据库看起来:

  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

接收错误数据的原因再次归因于时间?有没有办法解决这个问题?

2 个答案:

答案 0 :(得分:0)

select min(id), fName, sName, 
       sum(awards) as awards, 
       sum(smart) as smart, min(date) as date
from the_table
group by fName,   sName

更新尝试使用sum(NULLIF(smart,0))

答案 1 :(得分:0)

当您对记录进行分组(例如,获取总计等)时,仅返回可用于分组的列是有意义的。这意味着只有那些作为您的组计算基础的列。在您的情况下,只有fNamesName用于分组(因为您要为独特的员工进行分组)。

(附注:在此查询中,您的员工应该拥有某种唯一标识符,因为名称不一定是唯一的。)

因此,您应该只在group by中包含这些列。您可以使用sum函数获取awardssmart的数量,因为它们的值为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

请参阅此SQL Fiddle(我只添加了相关列)。