我有一个包含员工授予历史记录的数据库,因此将来我们可以计算出给特定员工颁发的奖项数量。我还有另一个专栏,其中包含有关员工没有穿着智能衣服上班的次数的信息。我想计算每个员工的奖励数量,以及员工未穿公司制服的时间。目前我的数据库看起来:
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
接收错误数据的原因再次归因于时间?有没有办法解决这个问题?
答案 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)
当您对记录进行分组(例如,获取总计等)时,仅返回可用于分组的列是有意义的。这意味着只有那些作为您的组计算基础的列。在您的情况下,只有fName
和sName
用于分组(因为您要为独特的员工进行分组)。
(附注:在此查询中,您的员工应该拥有某种唯一标识符,因为名称不一定是唯一的。)
因此,您应该只在group by
中包含这些列。您可以使用sum
函数获取awards
和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
请参阅此SQL Fiddle(我只添加了相关列)。