Oracle 连接两个案例陈述

Oracle 连接两个案例陈述,oracle,case,Oracle,Case,我想检查是否可以将两个案例陈述合并在一起?我尝试过类似的方法,但出现错误“ConsumptionBill是无效标识符”。我知道我得到了这个错误,因为我没有ConsumptionBill属性 那么,是否仍有可能加入双案例陈述 SELECT CustName, preRead, newRead, newRead-preRead AS TotConsumption, CASE WHEN SYSDATE - sentDate > 30 THEN Consumption + FP

我想检查是否可以将两个案例陈述合并在一起?我尝试过类似的方法,但出现错误“ConsumptionBill是无效标识符”。我知道我得到了这个错误,因为我没有ConsumptionBill属性

那么,是否仍有可能加入双案例陈述

    SELECT CustName, preRead, newRead, newRead-preRead AS TotConsumption, 
CASE
   WHEN SYSDATE - sentDate > 30 THEN Consumption + FP
   WHEN SYSDATE - sentDate > 45 THEN Consumption + SP
   ELSE ConsumptionBill + 0
  END as BIll
FROM ( 
        SELECT C.firstName||''||C.lastName as CustName, R.newReading prevRead,
               lead(R.newReading) OVER (PARTITION BY R.electircmeterID ORDER BY R.dateVisit) AS newRead, B.firstconRate as FR,
               B.secconRate as SR, B.thirdconRate as TR, P.firstPenAmt as FP, P.secPenAmt as SP, bl.sentDate,
               CASE
                WHEN newRead-preRead <= 20 THEN (newRead-preRead)*FR
                WHEN newRead-preRead <= 30 THEN 20*FR + (newRead-preRead-100)*SR
                WHEN newRead-preRead > 40 THEN 20*FR + 30*SR + ((newRead-previousRead)-50)*TR 
              END as Consumption
        FROM reading R, svcaddress S, electricmeter W, customer C, rate A, nonresrate B, penRate P, bill bl
           WHERE W.electricmeterID = S.electricmeterID 
           AND R.electricmeterID = W.electricmeterID 
           AND A.rateID = S.rateID
           AND B.rateID = A.rateID
           AND C.customerID = S.customerID 
           AND C.customerID = bl.customerID 
           AND R.readingID = bl.readingID
           AND P.preRateID = C.preRateID
           AND C.customerType = 'NonResidential'
           AND  r.datevisited >=  TO_DATE('01-05-2013','DD-MM-YYYY') 
           AND r.datevisited < TO_DATE('31-08-2013','DD-MM-YYYY')
        )where newRead is not null;

如果不把它放在你正在做的事情的上下文中看,很难判断

但是,您可能需要一个子选择

SELECT CASE
   WHEN SYSDATE - sentDate > 30 THEN ConsumptionBill + FP;
   WHEN SYSDATE - sentDate > 45 THEN ConsumptionBill + SP
   ELSE ConsumptionBill + 0
  END as TotalBIll
FROM (
  SELECT FP,
    sentDate,
    SP,
    CASE
      WHEN newRead-previousRead <= 100 THEN (newRead-previousRead)*FR
      WHEN newRead-previousRead <= 200 THEN 100*FR + (newRead-previousRead-100)*SR
      WHEN newRead-previousRead > 200 THEN 100*FR + 100*SR + ((newRead-previousRead)-200)*TR 
    END as ConsumptionBill
  FROM my_table
) t
在这里,我们创建一个中间记录集t,其中包括我们稍后要使用的计算字段ConsumptionBill


我说中间,但只是在概念上……查询计划员可能会也可能不会创建中间记录集—它可能不会创建中间记录集。

我认为这可能是OP想要的。CASE/WHEN可以在PL/SQL中使用,但由于他使用了别名,我打赌他想要的是SQL。感谢您的及时回复,我已经编辑了问题以显示我的完整查询。就像我没有说过的,我实际上在使用SQL。子查询是否仍然有效?@user3856751,是的,尽管看起来您可以将ConsumptionBill部分移动到现有子查询中,而无需创建任何新的子查询。@Paul Draper我已经尝试将ConsumptionBill放入现有子查询中。但它似乎总是为我的第二个case语句返回一个无效标识符。我已经更新了问题中的查询。