选择语句问题中的案例?
Posted
技术标签:
【中文标题】选择语句问题中的案例?【英文标题】:Case in Select Statement issue? 【发布时间】:2017-02-04 21:21:31 【问题描述】:我通常会在 java 中使用流行的 if-else 语句,但在 sqlplus 中我使用 select 语句中的 case 来查询我在下面的条件语句。
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
【问题讨论】:
这是错误的做法——难以编写、阅读和维护。相反,应该有一个小表,其中包含每个“定价结构”的阈值及其描述;只计算查询中的边距并加入这个小表。这样您就可以非常轻松地添加或删除级别、更改阈值和/或更改描述。 【参考方案1】: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 不为空,则打印 exp2,如果为空,则打印 exp3。不仅如此,你的 NVL 在这里什么也不做,因为它总是输出 ((retail-cost)/cost)*100。你最好写to_char(((retail-cost)/cost)*100),'99999.99')
。
如果你的 exp1 = exp2 那么你最好只写 NVL(exp1,exp2)。如果 exp1 不为 null 则打印,否则打印 exp2。
【讨论】:
折扣列的某些值为空,所以如果根本没有折扣;它仍然会在这里计算这个 ((retail-cost)/cost)*100 这个。 我想你把我弄糊涂了。我最后给出的描述是针对保证金计算的。 对不起。请忽略我之前的评论。我只记得折扣计算不包含在保证金列中。我将尝试绕过您建议的部分,我不必使用 nvl2 并直接进行计算。我在案例部分太分心了,我忘记了那一点信息嘿嘿。 我很感激这个指南,非常感谢你。它有效!【参考方案2】:您不能在案例陈述中使用别名“Margin”。您可以在案例陈述中使用“保证金”的整个公式,例如:
(case(Margin的NVL语句)>60)
另外,请确保在您的 case 语句中匹配相同的数据类型。因此,您不能使用 to_char( ) > 60,因为您将字符与整数进行比较。
希望这可能会有所帮助:-)
【讨论】:
【参考方案3】:使用公用表表达式 (CTE) 从案例逻辑中提取计算:
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;
祝你好运。
【讨论】:
以上是关于选择语句问题中的案例?的主要内容,如果未能解决你的问题,请参考以下文章