Застрял с конкретным оператором SQL, который не работает вообще - PullRequest
1 голос
/ 01 июня 2011

Я застрял с определенным оператором SQL, который вообще не работает.Я устранял это, но я получаю сообщения об ошибках, которые просты, но Я НЕ могу это исправить.

Однако я не могу заставить его работать.Результатом этого запроса является вычисленное значение -

Пожалуйста, помогите мне написать правильный запрос, который соответствует правилу бизнеса

Table name- MED_CLM  M
Different Columns - EXCL_AMT, BILL_CHRG_AMT

Правило бизнеса - Получить сумму не покрытой суммы

If M.EXCL_AMT < 0 and M.BILL_CHRG_AMT > 0 use -1*NVL(EXCL_AMT,0), 
else if EXCL_AMT > 0 and BILL_CHRG_AMT < 0 use -1*NVL(EXCL_AMT,0),
else use NVL(EXCL_AMT,0) 
SELECT SUM(NVL(EXCL_AMT,0))
FROM MED_CLM 

Я должен написать один SQL-запрос, включающий каждое условие выше

Ниже я поставил запрос. Я полагаю, что мне не хватает вещей в синтаксисе IF-ELSE -

IF (EXCL_AMT <0 AND BILL_CHg_AMT >0)

    BEGIN
      select sum (-1 * NVL(EXCL_AMT,0))
      from MED_CLM  
    END

ELSEIF (EXCL_AMT > 0 and BILL_CHRG_AMT < 0)

    BEGIN
      select sum (-1 * NVL(EXCL_AMT,0))
      from MED_CLM   
    END 

ELSEIF select SUM(NVL(EXCL_AMT,0))
       from MED_CLM
ENDIF;

Ответы [ 3 ]

4 голосов
/ 01 июня 2011

SQL не поддерживает условное выполнение операторов SELECT, как вы пытаетесь это сделать. PL / SQL делает, но это не имеет значения, так как значения для тестов берутся из таблицы, к которой вы обращаетесь.

Правильный ответ - простой элегантный (ну, элегантный) оператор CASE () в проекции запроса:

select sum(
        case
            when m.excl_amt < 0 and m.bill_chrg_amt > 0 then -1*nvl(m.excl_amt,0)
            when m.excl_amt > 0 and m.bill_chrg_amt < 0 then -1*nvl(m.excl_amt,0)
            else nvl(excl_amt,0)
        end
    ) as total_excl_amt
from med_clm m
/
2 голосов
/ 01 июня 2011

Синтаксис IF ... THEN, а не IF ... BEGIN. Но ваша главная проблема заключается в том, что вы пытаетесь выполнить это в обычном SQL-выражении, а не в хранимой процедуре. Вам нужно использовать CASE.

0 голосов
/ 01 июня 2011

Я думаю, что это должно реализовать описанную логику:

SELECT
  SUM(
    CASE
      WHEN EXCL_AMT <> 0 AND SIGN(EXCL_AMT) = -SIGN(BILL_CHRG_AMT)
      THEN -NVL(EXCL_AMT, 0)
      ELSE NVL(EXCL_AMT, 0)
    END
  )
FROM MED_CLM
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...