2017-02-04 5 views
1

Я бы обычно использовал популярный оператор if-else в java, но в sqlplus я использую случай в выражении select, чтобы запросить условное утверждение, которое я здесь ниже.Вопрос в вопросе о выпуске Select?

select title, to_char(nvl2(((retail-cost)/cost)*100, 
     ((retail-cost)/cost)*100, 
     ((retail-cost)/cost)*100), '99999.99') "Margin", 
     to_char(discount, '99999.99') "Discount", 
(case when ("Margin" >= 60) then 'Very High Profit' 
     when ("Margin" >= 30) then 'High Profit' 
     else ("Margin" >= 0) then 'Loss Leader' 
     end) "Pricing Structure" 
    from books 
    order by title; 

Я надеялся получить что-то подобное в качестве своего результата, но я попытался переместить заказ; Я все еще застрял с ошибкой каждый раз.

TITLE       Margin Discount Pricing Structure 
------------------------------ -------- --------- --------------------------------- 
BIG BEAR AND LITTLE DOVE   68.23   Very high profit 
BODYBUILD IN 10 MINUTES A DAY  65.07   Very high profit 
+0

Это неправильный способ сделать это - трудно писать, читать и поддерживать. Вместо этого должна быть небольшая таблица с порогом для каждой «Структуры ценообразования» и ее описания; вычислите только маржу в своем запросе и присоединитесь к этой маленькой таблице. Таким образом, вы можете легко добавлять или удалять уровни, изменять пороговые значения и/или изменять описания. – mathguy

ответ

4

sql не может видеть псевдоним, если он не находится в подзапросе. Вы должны написать что-то вроде:

case 
when (retail-cost/cost)*100 >= 60 then 'Very High Profit' 
when (retail-cost/cost)*100 >= 30 then 'High Profit' 
when (retail-cost/cost)*100 >= 0 then 'Loss Leader' 
else 'SOMETHING HERE' 
end "Pricing Structure" 

Что-то еще, чтобы рассмотреть, что это nvl2:

to_char(nvl2(((retail-cost)/cost)*100, 
    ((retail-cost)/cost)*100, 
    ((retail-cost)/cost)*100), '99999.99') 

ничего не делает для вас. Зачем? вызывают nvl2 (exp1, exp2, exp3). Если exp1 не является нулевым, тогда print exp2, когда он равен нулю, тогда print exp3. Не только это, но ваш NVL ничего не делает, потому что он всегда будет выводить ((розничная стоимость)/стоимость) * 100. Тебе лучше писать to_char(((retail-cost)/cost)*100),'99999.99').

Если ваш exp1 = exp2, вам лучше просто написать NVL (exp1, exp2). Если exp1 не является нулевым, он будет печатать его, иначе он будет печатать exp2.

+0

Некоторые значения равны нулю для столбца скидки, поэтому, если скидка вообще отсутствует; он все равно вычислил бы это ((розничная стоимость)/стоимость) * 100 здесь. –

+0

Я думаю, что вы меня смутили. Описание, которое я дал в конце, было для расчета Маржина. – Jucan

+0

Извините. Пожалуйста, не обращайте внимания на мои комментарии. Я просто помню, что расчет скидки не включен в столбец. Я попытаюсь попытаться обойти предложенную вами часть, где мне не нужно использовать nvl2, и просто перейдите прямо к вычислению. Я был слишком отвлечен в том случае, что забыл эту небольшую информацию. –

0

Вы не можете использовать псевдоним «Маржа» в заявлении вашего дела. Вы можете использовать всю формулу «Margin» в вашем случае заявлении, как:

(случай (Заявление NVL маржи)> 60)

Кроме того, убедитесь, чтобы соответствовать тем же типам данных в вашем случае заявлении , Таким образом, вы не можете использовать to_char()> 60, поскольку вы сравниваете символ с целым числом.

Надеется, что это может помочь :-)

0

Используйте Common Table Expression (КТР) факторизовать расчет от случая логики:

WITH CDATA AS (select title, 
         ((retail-cost)/cost)*100 AS MARGIN, 
         to_char(discount, '99999.99') AS "Discount" 
       from books) 
SELECT TITLE, 
     TO_CHAR(MARGIN, '99999.99') AS "Margin", 
     "Discount", 
     case 
     when MARGIN >= 60 then 'Very High Profit' 
     when MARGIN >= 30 then 'High Profit' 
     else MARGIN >= 0 then 'Loss Leader' 
     end AS "Pricing Structure" 
    order by title; 

удачи.

 Смежные вопросы

  • Нет связанных вопросов^_^