我暂时没有完成DB2查询,所以我在Select语句中遇到了数学表达式的问题。它不会抛出错误,但我得到了错误的结果。有人能告诉我DB2如何评估表达式? 我选择的部分内容如下。
值为:
应该读作(100 * 1)*(1 - (.000274 * 1268))= 65.2568
SELECT Value1,
value2,
(CASE
WHEN (T1.POINTS * T2.INVOLVEPOINTS) * (1 - .000274 * DAYS(CURRENT DATE) - DAYS(T1.FROMDT)) >= 0 THEN (T1.POINTS * T2.INVOLVEPOINTS) * (1 - .000274 * DAYS(CURRENT DATE) - DAYS(T1.FROMDT))
ELSE 0
END) AS POINTSTOTAL
FROM TABLE1;
答案 0 :(得分:1)
括号未强制执行正确的precedence of operations,并且缺少连接声明。此外,您可以使用MAX标量函数而不是重复的CASE语句。
以下是使用common table expressions模拟源数据的证据:
with
t1 (value1, points, fromdt)
as (select 1, 100, '2010-01-28' from sysibm.sysdummy1),
t2 (value2, involvepoints)
as (select 2, 1 from sysibm.sysdummy1)
select value1, value2,
max(0, t1.points * t2.involvepoints *
(1 - .000274 * (DAYS('2013-07-19') - DAYS(t1.fromdt)))) as pointstotal
from t1, t2;
结果是:
VALUE1 VALUE2 POINTSTOTAL
------ ------ -----------
1 2 65.256800
答案 1 :(得分:0)
你的意思是?
...
(T1.POINTS * T2.INVOLVEPOINTS) * (1 - .000274 * ( DAYS(CURRENT DATE) - DAYS(T1.FROMDT) ) )
...
注意减去日期周围的额外括号。通常乘法优先于加法,因此在原始查询中,将今天的日期乘以0.000274,从1中减去该值,然后从结果中减去FROMDT的值。
奇怪的是,你的解释中有这些括号,但在实际公式中没有。