2015-06-02 150 views
0

我有下面的情况,我需要计算下表中权重和价值计算

-------------------------------------------- 
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) 

我希望问题足够清楚了吗?请让我知道是否需要更多信息。

+0

我期待在这个查询中处理数以百万计的数据,因此我觉得相关的子查询可能会对我的性能产生影响,现在我正在尝试使用右外连接来获取所有数据另外我还有一个场景,刚刚更新 – Prakazz

+0

您正在使用哪些DBMS? Postgres的?甲骨文? –

+0

你能详细说明你如何计算分数值吗? – TheGameiswar

回答

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 

如果不是,则提供更多的数据。

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 
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 

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

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

最后我们总结所有由DateField和FieldValue分组的记录。