选择语句问题中的案例?

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;

祝你好运。

【讨论】:

以上是关于选择语句问题中的案例?的主要内容,如果未能解决你的问题,请参考以下文章

选择案例陈述和数据验证

尝试更新包含聚合函数(计数)的选择案例语句时出错

带有case语句的bigquery中的子选择

选择Case语句和数据验证

从选择案例返回值

Excel VBA - 选择案例 - 多个测试表达式