Выражение математического запроса AS400 DB2 в Select

Я некоторое время не выполнял запросы к DB2, поэтому у меня возникли проблемы с математическим выражением в моем операторе Select. Он не выдает ошибку, но я получаю неправильный результат. Может ли кто-нибудь сказать мне, как DB2 оценивает выражение? Часть моего выбора ниже.

Значения:

  • t1.Очки = 100
  • t2.Involvepoints = 1
  • (текущая дата - t1.fromdt) в днях составляет 1268 (так что это будет текущая дата 19.07.2013 - 28.01.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;

person Lele    schedule 19.07.2013    source источник


Ответы (2)


Скобки не обеспечивают правильный приоритет операций и объявление соединения отсутствует. Кроме того, вы можете использовать скалярную функцию 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
person James Allman    schedule 20.07.2013

Вы имели в виду это?

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

Обратите внимание на дополнительную пару скобок вокруг вычитания дат. Обычно умножение имеет приоритет над сложением, поэтому в исходном запросе вы умножаете сегодняшнюю дату на 0,000274, вычитаете ее из 1, а затем вычитаете из результата значение FROMDT.

Любопытно, что у вас есть эти скобки в вашем объяснении, но не в самой формуле.

person mustaccio    schedule 19.07.2013
comment
На самом деле это должно быть (1 - (.000274 * (Дни (текущая дата) - дни (t1.fromdt)). Я хочу получить разницу дат, затем умножить ее на .000274 и вычесть этот результат из 1. Я обычно используют MS Access SQL и могут использовать определенные поля запроса в том же запросе, что упрощает его, но не может найти способ сделать это в DB2. - person Lele; 20.07.2013
comment
Вы можете захотеть сохранить количество левых скобок равным количеству правых скобок, независимо от диалекта SQL. В вашем комментарии у вас 5 открывающих скобок и только 3 закрывающих... - person mustaccio; 20.07.2013