2016-04-06 6 views
-1

Ich habe zwei Tabellen:SQL-Abfrage Daten diffrence von insgesamt in zwei Tabellen erhalten

  1. booking - zeichnet die Auftragsdetail

    id | booking_amount 
    ------------------- 
    1 |   150 
    2 |   500 
    3 |   400 
    
  2. payment - zeichnet die Zahlung für die Bestellung

    id | booking_id | amount 
    ------------------------ 
    1 |   1 | 100 
    2 |   1 |  50 
    2 |   2 | 100 
    

Ich möchte alle Buchungen finden, bei denen die Zahlungen nicht vollständig sind. Mit den obigen Daten erwarten wir, dass die Antwort 2,3 lautet, da die Summe der Zahlungen für booking_id=1 mit der entsprechenden booking_amount im booking_table übereinstimmt.

+0

ich nicht verstehen, was genau u wollen. Wie lautet deine Antwort 2,3? –

+0

Bitte überprüfen Sie meine Frage erneut Ich habe Screenshot hinzugefügt – Rajiv

Antwort

0

Sie müssen einen äußeren Join verwenden, um Ihre beiden Tabellen zu kombinieren und nach Ihren Bedingungen zu suchen. Außerdem müssen Sie die Funktion SUM (..) verwenden, um die Summe des Betrags für jede ID in der Zahlungstabelle zu erhalten.

Bitte versuchen Sie dies:

select b.id from booking b 
left outer join -- cant be inner join because we lose id:3 in that case. 
(
    select booking_id, SUM(amount) as Total 
    from payment group by booking_id 
) p on b.id = p.booking_id 
where b.booking_amount > Coalesce(Total,0) --Coalesce is required for such values coming NULL, like id:3, they will be assigned as 0. 
+0

Wenn ich dies versucht habe Es zeigt Fehler Ungültige Verwendung der Gruppenfunktion – Rajiv

+0

Ich habe geändert. Habe aber gerade gemerkt, dass es sich im Grunde um Jean's Antwort gedreht hat. Ich werde später einen anderen Weg suchen und meine Antwort noch einmal aktualisieren. –

+0

Ja, ich glaube nicht, dass es eine bessere Lösung gibt. –

1

Um Ihre Frage zu beantworten, müssen Sie 2 Dinge, die Sie denken müssen über:

  1. Sie den Gesamtbetrag in der Tabelle payment von jeder Buchung Reihe wollen

  2. möchten Sie Ihre booking_amount Tabelle mit payment verbinden.


Teil 1 ist ganz einfach:

SELECT sum(amount) as TotalP, booking_id FROM payment GROUP BY booking_id 

nur eine einfache Abfrage mit einer einfachen Aggregatfunktion ...


Für Teil 2 wollen wir beitreten booking_amount und payment; die grundlegenden JOIN wäre:

SELECT * FROM booking b 
LEFT JOIN payment p ON b.id = p.booking_id 

Wir haben ein LEFT JOIN weil wir einige Buchung haben, die nicht in dem payment Tisch. Für diese Buchungen erhalten Sie NULL Wert. Wir werden COALESCE verwenden, um die Werte NULL durch 0 zu ersetzen.


Die letzte Abfrage ist dies:

SELECT b.id, COALESCE(TotalP, 0), b.booking_amount 
FROM 
booking b 
LEFT JOIN 
(SELECT sum(amount) as TotalP, booking_id FROM payment GROUP BY booking_id) as T 
ON b.id = T.booking_id 
WHERE COALESCE(TotalP, 0) < b.booking_amount 
+0

Sehr schön Es wird mir helfen, SQL-Abfrage zu schreiben. – Rajiv