Используйте новую переменную для CASE WHEN - PullRequest
1 голос
/ 31 января 2020

У меня есть следующая таблица:

CREATE TABLE my_table 
(
    the_debt_id varchar(6) NOT NULL, 
    the_debt_amount int NOT NULL, 
    the_debt_date date NOT NULL
)

INSERT INTO my_table
VALUES ('LMUS01', '180', '12/2/2019'), 
       ('LMUS01', '200', '11/2/2019'), 
       ('LMUS01', '300', '13/2/2019'), 
       ('LMUS02', '100', '10/2/2019'), 
       ('LMUS02', '150', '12/2/2019')

И я хочу создать переменную с именем debt_taxed, а затем переменную на основе debt_taxed, когда в определенных пределах ее называют «превышать», «содержится» или "переходящий:

SELECT the_debt_amount * 1.18 as debt_taxed, 
CASE WHEN the_debt_taxed >= 250 THEN 'Exceed' 
WHEN (the_debt_taxed < 250 and the_debt_taxed >= 200) THEN 'contained' 
ELSE 'rolling' 
END AS status 
FROM my_table

Но я получаю сообщение об ошибке, в котором говорится, что the_debt_taxed не существует.

Пожалуйста, любая помощь будет оценена.

Ответы [ 2 ]

3 голосов
/ 31 января 2020

Просто замените debt_taxed в вашем CASE фактическим расчетом.

SELECT
    debt_taxed = the_debt_amount * 1.18
    ,status = CASE
                  WHEN the_debt_amount * 1.18 >= 250 THEN 'Exceed'
                  WHEN
                  (
                      the_debt_amount * 1.18 < 250
                      AND the_debt_amount * 1.18 >= 200
                  ) THEN 'contained'
                  ELSE 'rolling'
              END
FROM my_table;

Если вы хотите использовать CTE (общее табличное выражение), вы должны сделать что-то вроде этого:

;WITH CTE AS
(
    SELECT
        debt_taxed = m.the_debt_amount * 1.18
        ,m.the_debt_id
        ,m.the_debt_date
    FROM my_table m
)
SELECT 
    c.debt_taxed
    ,c.the_debt_id
    ,c.the_debt_date
    ,status = CASE
                  WHEN c.debt_taxed >= 250 THEN 'Exceed'
                  WHEN
                  (
                      c.debt_taxed < 250
                      AND c.debt_taxed >= 200
                  ) THEN 'contained'
                  ELSE 'rolling'
              END
FROM CTE c;
2 голосов
/ 31 января 2020

Сделайте это с помощью подзапроса: замените таблицу my_table таблицей, содержащей столбец the_debt_amount * 1.18 с именем debt_taxed

SELECT debt_taxed, 
CASE WHEN the_debt_taxed >= 250 THEN 'Exceed' 
WHEN (the_debt_taxed < 250 and the_debt_taxed >= 200) THEN 'contained' 
ELSE 'rolling' 
END AS status 
FROM (SELECT *, the_debt_amount * 1.18 as debt_taxed from my_table) a
...