选择中的AS400 DB2查询数学表达式

时间:2013-07-19 17:53:38

标签: sql db2 ibm-midrange

我暂时没有完成DB2查询,所以我在Select语句中遇到了数学表达式的问题。它不会抛出错误,但我得到了错误的结果。有人能告诉我DB2如何评估表达式? 我选择的部分内容如下。

值为:

  • t1.Points = 100
  • t2.Involvepoints = 1
  • (当前日期 - t1.fromdt)的天数是1268(所以它是最新的 日期7/19/2013 - 01/28/2010(天)

应该读作(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;

2 个答案:

答案 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的值。

奇怪的是,你的解释中有这些括号,但在实际公式中没有。