2013-02-12 70 views
0

的得分表中所列数据的约当人们开始和一个大表完成任务,例如:分组的整体得分基于值的范围和SQLite中

 
Person | Task | Date started | Date ended 
--------------------------------------------- 
A  Cleaning 20-FEB-2012 22-FEB-2012 
N  Dishes 20-FEB-2012 24-FEB-2012 
Z  Cleaning 21-FEB-2012 23-FEB-2012 

和分配的分数评分表2,3,4每个任务根据他们花多长时间才能做到这一点,如:

 
| Task | Days taken | Score 
--------------------------- 
Cleaning  2  2 
Cleaning  1.5  3 
Cleaning  1  4 
Dishes  3  2 
Dishes  2.5  3 
Dishes  2  4 

我怎么可能会生成查询这给每个人的综合得分为每个任务,例如:

 
Person | Task | Overall Score 
--------------------------------------------- 
A  Cleaning 3.1 
A  Dishes 2.7 
N  Cleaning 3.4 

该解决方案一直在巧妙地避开我,一些帮助将不胜感激!目前我正在使用SQLite。

+0

不要在提到任务ID的第一个表中有FK! – Akash 2013-02-12 03:06:02

+0

不,设计我正在使用的数据库的人通常将字符串值(如Task的值)视为他的FK而不是实际的ID。 – 2013-02-15 06:11:59

回答

0

您的定义含糊不清。但是,以下内容可以帮助您:

select t.person, t.task, sum(s.score) 
from tasks t left outer join 
    score s 
    on t.task = s.task and 
     s.daysTaken = t.julianday(dateended) - t.julianday(datestarted) 
group by t.person, t.task 

处理范围有点困难。您需要获取间隔的两端,然后执行加入:

select t.person, t.task, sum(s.score) 
from tasks t left outer join 
    (select s.*, 
      (select min(days_taken) from score s2 where s2.person = s.person and s2.task = s.task and s2.days_taken > s.days_taken 
      ) as nextDays_Taken 
     from score s 
    ) s 
    on t.task = s.task and 
     t.julianday(dateended) - t.julianday(datestarted) >= s.days_taken and 
     t.julianday(dateended) - t.julianday(datestarted) < nextDays_Taken 
group by t.person, t.task 
+0

太好了,谢谢。我意识到问题还有另外一个方面 - 分数实际上是范围,即清洁任务<1天为4分,1 <天<2分为3分,> 2天为分数2.当s.daysTaken不直接落在1,1.5,2上时,我看不出如何执行连接。 – 2013-02-15 06:10:51