2014-07-27 5 views
1

Je voudrais vérifier s'il est possible de joindre deux instructions de cas ensemble? J'ai essayé quelque chose comme ça, mais j'ai une erreur 'ConsumptionBill est un identifiant invalide'. Je sais que j'ai cette erreur car je n'ai pas d'attribut ConsumptionBill.Joindre deux instructions de cas

Alors est-il encore possible de joindre les deux instructions de cas?

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; 

Répondre

1

Il est difficile de le dire sans le voir dans le contexte de ce que vous faites.

Cependant, vous voulez probablement une sous-sélection

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 

Ici, nous créons un dossier intermédiaire établi t qui comprend ce champ calculé ConsumptionBill nous voulons utiliser plus tard.

(je dis « intermédiaire », mais seulement sur le plan conceptuel ... le planificateur de requêtes peut ou non faire un jeu d'enregistrements intermédiaire -. Il ne sera probablement pas)

+1

Je pense que c'est probablement ce que l'OP veut . CASE/WHEN peut être utilisé en PL/SQL mais comme il a utilisé des alias, je parie que c'est SQL qu'il veut. – toddlermenot

+0

merci pour la réponse rapide, j'ai déjà édité la question pour montrer ma requête complète. comme quoi toddlermenot a dit que je suis en train d'utiliser SQL. La sous-requête fonctionne-t-elle toujours? – user3856751

+0

@ user3856751, oui, bien qu'il semble que vous pouvez déplacer la partie 'ConsumptionBill' dans votre sous-requête existante sans en créer de nouveaux. –