it-swarm.com.de

Wählen Sie Summe und Inner Join aus

Ich habe zwei Tische

  • Bills: id amount reference 

  • Transactions: id reference amount

Die folgende SQL-Abfrage

SELECT 
   *,
   (SELECT SUM(amount) 
    FROM transactions 
    WHERE transactions.reference = bils.reference) AS paid
FROM bills
GROUP BY id HAVING paid<amount

war für einige Zeilen aus der Tabelle Bills gedacht und fügte eine Spalte paid mit der Summe der Anzahl der zugehörigen Transaktionen hinzu.

Es funktioniert jedoch nur, wenn für jede Rechnung mindestens eine Transaktion vorhanden ist. Andernfalls wird keine Zeile für eine Transaktion ohne Rechnung zurückgegeben.

Wahrscheinlich, weil ich eine innere Verbindung hätte machen sollen! 

Also versuche ich folgendes:

SELECT 
   *,
   (SELECT SUM(transactions.amount) 
    FROM transactions 
    INNER JOIN bills ON transactions.reference = bills.reference) AS paid
FROM bills
GROUP BY id 
HAVING paid < amount

Dies liefert jedoch für alle Zeilen den gleichen bezahlten Wert! Was mache ich falsch ?

10
Klaus

Verwenden Sie einen linken Join anstelle einer Unterabfrage:

select b.id, b.amount, b.paid, sum(t.amount) as transactionamount
from bills b
left join transactions t on t.reference = b.reference
group by b.id, b.amount, b.paid
having b.paid < b.amount

Bearbeiten:
Um die Summe der Transaktionen mit dem Betrag zu vergleichen, behandeln Sie den Nullwert, den Sie erhalten, wenn keine Transaktionen vorhanden sind:

having isnull(sum(t.amount), 0) < b.amount
17
Guffa

Sie benötigen einen RIGHT JOIN, um alle Rechnungszeilen einzuschließen.

EDIT Die letzte Abfrage ist also

SELECT 
   *,
   (SELECT SUM(transactions.amount) 
    FROM transactions 
    WHERE transactions.reference = bills.reference) AS paid
FROM bills
WHERE paid < amount
2
dotNET

Ich weiß, dass dieser Thread alt ist, aber ich bin heute hierher gekommen, weil ich das gleiche Problem habe.

Bitte sehen Sie einen anderen Beitrag mit derselben Frage: Summe auf einem linken Join SQL

Verwenden Sie, wie die Antwort sagt, GROUP BY in der linken Tabelle. Auf diese Weise erhalten Sie alle Datensätze aus der linken Tabelle und summiert die entsprechenden Zeilen der rechten Tabelle.

Versuchen Sie, dies zu verwenden:

SELECT
   *,
  SUM(transactions.sum)
FROM
   bills
RIGHT JOIN
   transactions
ON
   bills.reference = transactions.reference
WHERE
   transactions.sum > 0
GROUP BY
   bills.id
0
VKS