0

我已经有一段时间没有进行 DB2 查询了,所以我在 Select 语句中遇到了数学表达式的问题。它不会引发错误,但我得到了错误的结果。谁能告诉我 DB2 如何评估表达式?我的部分选择如下。

这些值为:

  • t1.Points = 100
  • t2.Involvepoints = 1
  • (当前日期 - t1.fromdt)以天为单位是 1268(因此它将是当前日期 2013 年 7 月 19 日 - 2010 年 1 月 28 日)

它应该像 (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;
4

2 回答 2

1

括号没有强制执行正确的操作优先级,并且缺少连接声明。此外,您可以使用MAX标量函数代替重复的CASE语句。

下面是一个使用公用表表达式来模拟源数据的证明:

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
于 2013-07-20T00:57:02.850 回答
0

你是这个意思吗?

...
(T1.POINTS * T2.INVOLVEPOINTS) * (1 - .000274 * ( DAYS(CURRENT DATE) - DAYS(T1.FROMDT) ) ) 
...

请注意日期减法周围的额外括号。通常乘法优先于加法,因此在原始查询中,将今天的日期乘以 0.000274,从 1 中减去,然后从结果中减去 FROMDT 的值。

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

于 2013-07-19T19:46:06.560 回答