2016-04-15 6 views
0

Ich versuche, Daten in Bezug auf Rechnungen abrufen. Es gibt mehrere Datensätze pro Rechnung, die Originalrechnung, Zahlungen, Gutschriften. Ich brauche Daten basierend auf zwei Feld, record_type (I = Rechnung, C = Kredit, P = Zahlung ...) und Quelle (B = Abrechnung, C = Geldeingang ...).Mehrere Datenzeilen basierend auf zwei Kriterien abrufen müssen

Ich muss die abgerufenen Datensätze auf source = B beschränken und alle Datensätze von record_type <> P erhalten, aber wo ist ein record_type = C vorhanden.

Beispiel-Datensatz:

Invoice  Amount  record_type  source --comment 
    12345  100  I    B  original invoice 
    12345  -100  C    B  credit memo 
    12345  80   I    B  revised invoice 
    12345  -80  P    C  payment 
    23456  200  I    B  original invoice 
    23456  -10  C    C  cash receipt adjust 
    34567  300  I    B  original invoice 

Die abgerufenen Datensätze sollte sein:

Invoice  Amount  record_type  source --comment 
    12345  100  I    B  original invoice 
    12345  -100  C    B  credit memo 
    12345  80   I    B  revised invoice 

Hier ist der Code, den ich bis jetzt haben.

SELECT 
     ot.order_id, 
     ot.customer_id, 
     c.name, 
     ot.gl_date, 
     ot.amount, 
     ot.record_type, 
     ot.source 

    FROM open_item ot 
     JOIN customer c ON c.id = ot.customer_id and 
     c.company_id = 'TMS' 
     JOIN orders o ON o.id = ot.order_id 

    WHERE 
     ot.source = 'B' AND 
     ot.gl_date >= {d '2016-03-01'} AND 
     ot.gl_date <= {d '2016-03-31'} AND 
     ot.record_type <> 'P' AND 
    EXISTS (SELECT 1 FROM open_item ot2 
     WHERE ot2.order_id = ot.order_id AND 
     ot2.record_type = 'C' AND ot2.source = 'B') 

    ORDER BY 
     ot.order_id 

Dank @GordonLinoff für die Hilfe mich bis hierher zu bekommen. Ich bekomme auch einen Fehler basierend auf meiner ORDERBY, aber das ist ein kleines Problem für jetzt.

Antwort

0

Ihre Kriterien für die Bestellung mit record_type = C in einen inneren Join verschoben.

SELECT 
    ot.order_id, 
    ot.customer_id, 
    c.name, 
    ot.gl_date, 
    ot.amount, 
    ot.record_type, 
    ot.source 

FROM open_item ot 
    JOIN customer c ON c.id = ot.customer_id and 
    c.company_id = 'TMS' 
    JOIN orders o ON o.id = ot.order_id 
    JOIN open_item ot2 ON ot2.order_id = ot.order_id AND ot2.record_type = 'C' 
WHERE 
    ot.source = 'B' AND 
    ot.gl_date >= {d '2016-03-01'} AND 
    ot.gl_date <= {d '2016-03-31'} AND 
    ot.record_type <> 'P' 
ORDER BY 
    ot.order_id 
+0

Das hat funktioniert. Vielen Dank! Jetzt, um herauszufinden, warum ORDER BY nicht funktioniert. Etwas über nicht in einer Aggregatfunktion oder die GROUP BY-Klausel enthalten sein ..... –

+0

Ich sehe nichts in dieser Abfrage aggregieren Daten. Gibt es einen Code davor oder danach, der diesen Fehler erzeugt oder mit dieser Abfrage verknüpft wird? – dbbri

+0

Für Datensätze, die eine "C" record_type und "C" Quelle haben, wird nur der Datensatz mit dem "I" record_type aufgelistet. In meinem Beispieldatensatz wird nur die erste Zeile der Rechnung 23456 angezeigt und ich versuche, dies wegzulassen. –

0

Ich verwendete @dbbri Antwort und fügte eine zusätzliche Bedingung hinzu.

FROM open_item ot 
    JOIN customer c ON c.id = ot.customer_id and 
    c.company_id = 'TMS' 
    JOIN orders o ON o.id = ot.order_id 
    JOIN open_item ot2 ON ot2.order_id = ot.order_id 
    AND ot2.record_type = 'C' 
    **AND ot2.source = 'B'** 
Verwandte Themen