我有以下情况,我需要计算下表中提供的字段值的分数值
--------------------------------------------
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 :(得分:0)
假设表名是T1
和T2
,我只能想到的是:
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分组的所有记录汇总。