SQL_Case и когда

#sql #case #feature-selection

Вопрос:

У меня есть набор данных, в котором мне нужно рассчитать минимальную причитающуюся сумму. Я использовал приведенный ниже код

 SELECT *, Sales - Reversal AS Net_Sale, charge1 - charge1_rev AS Net_Fee1,

CASE WHEN Net_Sale < 500 THEN Net_Sale
ELSE 0.1*Net_Sale END 
AS Min_Sale_amt,

Min_Sale_amt   Net_Fee1 AS Min_AmountDue
FROM Table
 

Намерение состоит в том, чтобы внести минимальную сумму в размере 500 рупий, если чистые продажи меньше 500 рупий, если чистые продажи больше 500 рупий, то мне нужно рассчитать 10% от чистых продаж.

Примеры данных для справки

 create table sales(
sales int,
Reversal int,
charge1 int,
charge1_rev int
);

Insert into sales values(1000,200,10,0);
Insert into sales values(495,0,10,0);
 

По какой-то причине я не могу получить результат.
Помощь была бы очень признательна!

Комментарии:

1. Отметьте свой вопрос в базе данных, которую вы используете

Ответ №1:

Сначала вычислите псевдонимы в CTE, затем выполните подзапрос, чтобы получить желаемый результат:

 WITH cte AS (
    SELECT *, Sales - Reversal AS Net_Sale,
              charge1 - charge1_rev AS Net_Fee1,
              CASE WHEN Sales - Reversal < 500
                   THEN Sales - Reversal
                   ELSE 0.1*(Sales - Reversal) END AS Min_Sale_amt
    FROM sales
)

SELECT *, Min_Sale_amt   Net_Fee1 AS Min_AmountDue
FROM cte;
 

Комментарии:

1. Просто комментарий, согласно ANSI SQL, один * в списке выбора не может быть объединен ни с чем другим. Чтобы соответствовать стандартам, сделайте select cte.*, ... это . (Некоторые СУБД здесь придирчивы…)

2. @jarlh Правильно, и для Oracle мой запрос не будет компилироваться. Но для большинства баз данных это нормально.

3. Привет @TimBiegeleisen, я попытался выполнить приведенный выше запрос, который сработал. Однако я не смогу запускать временные таблицы на серверах. Любые материалы для обхода очень помогли бы!