在 select 子句中的另一个案例中使用案例列

Using a case column within another case in select clause

我有一个带有 case 语句的 select 子句,我需要创建另一个 case 语句来比较前一个 case 语句创建的列。像这样:

select client
    ,discount
    ,(case when sales_avg>10000 then 30 
        when sales_avg>5000 then 20 
        else 0 end) discount_rule
    ,(case when discount < discount_rule then 1 else 0 end) status 
from sales;

我收到一条消息 discount_rule is unknown。我怎样才能做到这一点?

您可以使用 Common Table 表达式 (CTE) 并在 CTE 中引用 CTE 为:

with CTE_discount_rule as
(
       select client,
              discount,
       (case when sales_avg>10000 then 30
             when sales_avg>5000 then 20 
             else 0 end) as discount_rule
       from sales
),
CTE_Final_Status as
(
  select client,
         discount,
         discount_rule,
         (case when discount < discount_rule then 1 else 0 end) as status 
  from CTE_discount_rule

)
select * from CTE_Final_Status;

最简单的方法是使用 returns 列 discount_rule:

的子查询
select t.client, t.discount, t.discount_rule,
  case 
    when discount < discount_rule then 1 
    else 0 
  end status
from (
  select client, discount,
    case 
      when sales_avg > 10000 then 30 
      when sales_avg > 5000 then 20 
      else 0 
    end discount_rule
  from sales
) t