重量和价值计算

时间:2015-06-02 13:49:58

标签: sql

我有以下情况,我需要计算下表中提供的字段值的分数值

--------------------------------------------
DataField                      FieldValue
--------------------------------------------
DataField1                     21
DataField2                     59
DataField3                     72
DataField4                     521

我们有一个看起来像这样的参考表

--------------------------------------------
ValueFrom        ValueTo        AssignedValue
--------------------------------------------
0                20             1        
21               40             1        
41               60             1        
61               360            12
361              999            1 --(1 point for every 15 after 360)

并且预期结果看起来像这样

--------------------------------------------
DataField      FieldValue      ScoreValue
--------------------------------------------
DataField1     21              2  (1+1)
DataField2     59              3  (1+1+1)
DataField3     72              15 (1+1+1+12)
DataField4     521             23 (15+11)--(161 = 150+11 i.e. 10+1)

我希望这个问题足够明确?如果需要更多信息,请告诉我。

3 个答案:

答案 0 :(得分:0)

假设表名是T1T2,我只能想到的是:

SELECT 
    T1.DataField as DataField, 
    T1.FieldValue as FieldValue, 
    (SELECT SUM(T2.AssignedValue) FROM T2 WHERE T2.ValueFrom < T1.FieldValue) as ScoreValue
FROM
 T1

如果不是那样,那么提供更多数据。

答案 1 :(得分:0)

使用相关的子查询SUM

select DataField,
       FieldValue,
       (select sum(AssignedValue) from table2 t2
        where t2.ValueFrom < t1.FieldValue) as ScoreValue
from table1 t1

或使用JOIN执行GROUP BY

select t1.DataField,
       t1.FieldValue,
       SUM(t2.AssignedValue) as ScoreValue
from table1 t1
  join table2 t2 on t1.FieldValue > t2.ValueFrom
group by t1.DataField,
         t1.FieldValue

答案 2 :(得分:0)

我认为您需要以下内容

select DateField, FieldValue, sum(assignedValue) as ScoreValue
from (
        select DateField, FieldValue, AssignedValue
          from T1 
         inner join T2 on T2.ValueFrom <= T1.FieldValue
         --
         union all
         --
         select DateField, FieldValue, (FieldValue - 375)/15 as AssignedValue 
          from T1
         where FieldValue > 375  
         -- Values 361 - 375 will pick up the first point per 15 in the first select
     ) inlineTable
group by DateField, FieldValue

只是为了解释我的想法:联合中的第一个选择将第一个表连接到ValueFrom小于或等于FieldValue的每一行。

超过360的值只会得到一分,所以我们需要一些东西来修复这个记录,这些记录应该得到超过360或更高的额外点数。这是第二个选择的来源 - 以及为什么它只适用于FieldValues大于375.为了计算所需的额外点,我们找到FieldValue和375之间的差异然后将其除以15 - 假设数据库中的两个值都被定义为int,结果不应该进入小数,并且返回一个int。

最后,我们将按DateField和FieldValue分组的所有记录汇总。