2017-11-06 6 views
0

Ist es möglich, eine Summenabfrage durchzuführen, bei der die Zeile für jeden Teil der Summe aus einem Join ermittelt wird?Summenabfrage mit Bezug auf verschiedene Spalten für jede Zeile?

Zum Beispiel, wenn ich Tabellen

table A 
id | value 
1 | 10 
2 | 15 
3 | 10 

Und

table b 
id | b | c 
1 | 2 | 3 
2 | 1 | 2 

Ist es möglich, ein SUM(tableA.value * tableB.<specific_column>) zu tun, wo entweder die SUM ausgeführt wird direkt als Verknüpfung oder die Join-Tabelle von prequired ist eine Spezifikation, aus Gründen des Arguments, eine Zeichenfolge "bcb"?

Edit:

Das Endergebnis Ich hoffe, dazu wäre zu erreichen äquivalent:

SUM(SELECT value * b FROM tableA a JOIN tableB b ON b.id = 1 WHERE a.id = 1, 
    SELECT value * c FROM tableA a JOIN tableB b ON b.id = 1 WHERE a.id = 2, 
    SELECT value * b FROM tableA a JOIN tableB b ON b.id = 2 WHERE a.id = 3); 

Ich denke, es gibt zwei Teile dazu: Ein einfacher von A verbinden und ausgewählte Werte von B so dass B auf eine einzelne selectValue-Spalte reduziert wird.

Danke.

+0

https://stackoverflow.com/questions/7432178/how-can-i-sum-columns-across-multiple-tables-in-mysql – dzm

+0

Bitte ** [EDIT] ** Ihre Frage und fügen Sie die erwartete Ausgabe basierend auf Ihrer Probe diese Daten hinzu. –

+0

Ich ersetzte das 'psql'-Tag durch' postgresql'. Das Tag 'psql' bezieht sich auf den Standard-Befehlszeilenclient für Postgres, nicht auf die Datenbank selbst. –

Antwort

1

Wie in Kommentar gefragt sollte es besser sein, um uns zu zeigen, was Ausgabe, die Sie wirklich will, aber wie ich verstehen möchte, dass Sie etwas tun:

SELECT id, SUM(a.value * b.b) 
    FROM a JOIN b USING(id) 
GROUP BY id; 

Es ist, was Sie wollen? Ich verstehe dich nicht wirklich "bcb" Punkt ...

Nicht, weil Sie in Ihrem Kommentar SUM (Wert, Wert, Wert) gesagt haben und ich denke, dass Sie diese Werte hinzufügen möchten, werde ich so etwas tun :

WITH 
sum1 AS (SELECT value * b AS res 
      FROM tableA a 
      JOIN tableB b ON b.id = 1 
      WHERE a.id = 1), 
sum2 AS (SELECT value * c AS res 
      FROM tableA a 
      JOIN tableB b ON b.id = 1 
      WHERE a.id = 2), 
sum3 AS (SELECT value * b AS res 
      FROM tableA a 
      JOIN tableB b ON b.id = 2 
      WHERE a.id = 3) 
SELECT SUM(sum1.res + sum2.res + sum3.res) 
    FROM sum1, sum2, sum3; 
+0

Danke für die Antwort. Ich habe die Frage bearbeitet, hoffentlich ein bisschen klarer. – CBusBus

+0

@ Hervé Piedvache Ihre Abfrage gibt 'NULL' zurück. Es funktioniert nicht, weil die Unterabfragen 'NULL' oder zwei Spalten zurückgeben. Ihre Abfrage funktioniert nur, wenn die Unterabfrage eine Zahl zurückgibt. – Dan

+0

Sie müssen in diesem Fall um jede Multiplikation etwas hinzufügen wie: COALESCE (Wert * b, 0) AS res das wird funktionieren. –

0

ich habe @ Hervé Piedvache Code getestet und es gibt NULL zurück, weil SELECT value * b AS val FROM tableA a JOIN tableB b ON b.id = 1 WHERE a.id = 1 zwei Zeilen. Eine Arbeit um wäre:

SELECT SUM(val) FROM 
    (SELECT value * b AS val FROM tableA a JOIN tableB b ON b.id = 1 WHERE a.id = 1 
    UNION 
    SELECT value * c AS val FROM tableA a JOIN tableB b ON b.id = 1 WHERE a.id = 2 
    UNION 
    SELECT value * b AS val FROM tableA a JOIN tableB b ON b.id = 2 WHERE a.id = 3) data; 
Verwandte Themen