#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, я попытался выполнить приведенный выше запрос, который сработал. Однако я не смогу запускать временные таблицы на серверах. Любые материалы для обхода очень помогли бы!