2016-04-15 13 views
0

Bitte beachten Sie folgenden Code und die Ergebnisse von den erwarteten ErgebnissenRechnungssaldo pro Zeile

SELECT 
    DISTINCT VW_PM_INV_BAL.invoice_no,      
    VW_PM_INV_BAL.quote_section_id , 
    paymatic_debtors_info.type, 
    cl$invoices.total INVOICED_AMT, 
    paymatic_debtors_info.amount PAID_CR_REV 
FROM 
    paymatic_debtors_info 
left outer JOIN cl$invoices 
    ON cl$invoices.invoice_no = paymatic_debtors_info.ref 
left outer JOIN VW_PM_INV_BAL 
    ON VW_PM_INV_BAL.invoice_no = cl$invoices.invoice_no 
WHERE 
    VW_PM_INV_BAL.quote_section_id = '1000065052' 
ORDER BY 1, 2 DESC; 

Ergebnisse

Invoice_no Quote_section_id Type Invoiced Paid_CR_REV 
729001  1000065052   Inv  70680  70680 
729001  1000065052   Pmt  70680  -70680 
732331  1000065052   Inv  21556.26 21556.26 
732331  1000065052   Pmt  21556.26 -21556.26 
751231  1000065052   Inv  21556.374 21556.37 
751231  1000065052   Pmt  21556.374 -21556.37 
753107  1000065052   Inv  21556.374 21556.37 
753107  1000065052   Pmt  21556.374 -21556.37 
753107  1000065052   Rev  21556.374 21556.37 

Erwartet

Invoice_no Quote_section_id Type Invoiced Paid_CR_REV Balance 
729001  1000065052  Inv 70680 
729001  1000065052  Pmt   -70680   0 
732331  1000065052  Inv 21556.26 
732331  1000065052  Pmt   -21556.26  0 
751231  1000065052  Inv 21556.374 
751231  1000065052  Pmt   -21556.37  0 
753107  1000065052  Inv 21556.374 
753107  1000065052  Pmt   -21556.37  0 
753107  1000065052  Rev 21556.374    21556.374 
+0

Bitte bearbeiten Sie Ihre Frage richtig. – surajsn

+0

bitte markieren Sie die Unterschiede zwischen den tatsächlichen und erwarteten Ergebnissen. Formatierung ist auch erforderlich –

+0

Wenn LINKE VERBINDEN, setzen Sie die Bedingungen der rechten Seitentabelle in die ON-Klausel, um echtes linkes Join-Verhalten zu erhalten. (Wenn in WHERE, erhalten Sie regelmäßige innere Join-Ergebnis.) – jarlh

Antwort

0

So

  • für eine Inv-Zeile, die Sie in Rechnung stellen möchten, aber weder Paid_CR_REV noch Balance.
  • für eine 'Pmt' Zeile, die Paid_CR_REV und Rechnung + Paid_CR_REV als Saldo, aber nicht in Rechnung gestellt werden soll.
  • für eine 'Rev'-Zeile, die doppelt angezeigt werden soll, einmal als in Rechnung gestellt, einmal als Saldo und ohne Paid_CR_REV.

Verwenden CASE WHEN entsprechend:

select 
    bal.invoice_no, 
    bal.quote_section_id , 
    pdi.type, 
    case when pdi.type in ('Inv', 'Rev') then inv.total end as invoiced, 
    case when pdi.type = 'Pmt' then pdi.amount end as paid_cr_rev, 
    case when pdi.type = 'Pmt' then inv.total + pdi.amount 
     when pdi.type = 'Rev' then inv.total end as balance 
from paymatic_debtors_info pdi 
join cl$invoices inv on inv.invoice_no = pdi.ref 
join vw_pm_inv_bal bal on bal.invoice_no = inv.invoice_no 
where bal.quote_section_id = '1000065052' 
order by 1, 2 desc; 

Mindestens das ist, was ich entnehme, was Sie zeigt. Sie haben nicht wirklich eine Frage gestellt und uns nichts über Ihre Tabellen und die Berechnung der Ergebnisse erzählt. Sie müssen die obige Abfrage möglicherweise noch etwas anpassen.

Ich glaube nicht, Sie brauchen DISTINCT hier, also habe ich es entfernt. Legen Sie es zurück, wenn Sie es brauchen. (Oder schreibe die Abfrage so um, dass du es nicht schreibst.)

Ich glaube nicht, dass du auch Outer Joins benötigst (in deinen gezeigten Ergebnissen sind mindestens alle Datensätze immer vorhanden), also habe ich auch diese entfernt.

+0

Ich bekomme einen fehlenden Keyword-Fehler –

+0

Nein, es beschweren sich über Zeile 5 –

+0

Also wenn gesagt, die Linie, bist du noch nicht in der Lage den Fehler zu erkennen? Ich habe einfach vergessen, Ihre Spaltenaliasnamen zu entfernen, das ist alles. Die Tatsache, dass Sie solche einfachen Tippfehler noch nicht entdecken können, sowie ein zweifelhaftes DISTINCT und unpassende Outer-Joins lassen mich denken, dass Sie mit einfacheren Abfragen beginnen und zuerst mit ihnen üben sollten. Lerne SQL Schritt für Schritt. –