2013-08-09 27 views
8

Ich versuche zu bestimmen, wie Summenfelder zwischen zwei Tabellen zu tun.Abfrage SUM für zwei Felder in zwei verschiedenen Tabellen

In Tabelle 1 werden wir es kurz nennen gegevens, hätte ich zum Beispiel gegevenID, vertrekdatum, prijs

In Tabelle 2 werden wir es Gebühren nennen, ich hätte zum Beispiel , feedID, gegevenID, Betrag

Ich möchte die Werte für prijs basierend auf Jahr (vertrekdatum) von gegevens nehmen und summieren.

Ich hatte versucht, eine LINKE VERBINDUNG zu machen und es funktionierte, bis es zwei Datensätze für die gleiche gegevenID in der Tabelle der Gebühr gab., Dann verdoppelte es die prijs.

Tabelle Beispiel:

GEGEVENS 
---------------------------------- 
gegevenID | vertrekdatum | prijs | 
---------------------------------- 
|  1 | 2011-01-01 |1385.88| 
|  2 | 2011-03-01 | 450.26| 
|  3 | 2012-01-01 |2505.10| 
---------------------------------- 

FEES 
---------------------------- 
feeID | gegevenID | amount | 
---------------------------- 
| 1 |   2 | 50.00| 
| 2 |   2 | 126.00| 
| 3 |   3 | 50.00| 
---------------------------- 

Die Ergebnisse, die ich will

TOTALS 
-------------------------------------------- 
| year | SumOfPrijs | SumOfFees | Total | 
-------------------------------------------- 
| 2011 | 1836.14 | 176.00 | 2012.14 | 
| 2012 | 2505.10 | 50.00 | 2555.10 | 
-------------------------------------------- 

Diese Abfrage führte zur verdoppelt ‚prijs‘ sind, wenn es berücksichtige es in den Gebühren zwei Reihen waren Tabelle für eine gegevenID.

SELECT sum(prijs) as SumOfPrijs, sum(amount) as SumOfFees, sum(prijs)+sum(amount) AS 
Total, year(vertrekdatum) as year 
FROM tbl_vluchtgegevens vg 
LEFT JOIN tbl_fees f 
ON f.gegevenID = vg.gegevenID 

WHERE vertrekdatum <=NOW() 
GROUP by year(vertrekdatum) 

Alle Gedanken wären toll.

Antwort

12

Sie benötigen eine Unterabfrage verwenden, um die Gebühren-Tabelle zu aggregieren vor dem Join:

SELECT sum(prijs) as SumOfPrijs, sum(amount) as SumOfFees, sum(prijs)+sum(amount) AS 
Total, year(vertrekdatum) as year 
FROM tbl_vluchtgegevens vg LEFT JOIN 
    (select f.gegevenId, sum(amount) as Amount 
     from tbl_fees f 
     group by f.gegevenId 
    ) f 
    ON f.gegevenID = vg.gegevenID 
WHERE vertrekdatum <=NOW() 
GROUP by year(vertrekdatum); 

Das Problem ist, dass die mehreren Gebühren auf auf „gegeven“ die Verbindung verursacht unerwartete Zeilen zu erzeugen, dass die Auswirkungen auf Summe.

+0

das ist perfekt. Vielen Dank für die Hilfe. Ich hatte eine ähnliche Option versucht, aber es würde keine Ergebnisse liefern, wenn in der Gebührentabelle keine Werte vorhanden wären, die der gegevenID in der Tabelle tbl_vluchtgegevens entsprachen. –

+1

Es könnte nett sein, dies als Antwort anzunehmen – Strawberry

3

Bei einer Verbindung in einer beliebigen Form werden die Werte verdoppelt, wenn zwei gegevenID Zeilen in fees liegen (oder verdreifachen, wenn es drei gibt usw.).

Die beste Abhilfe ich denken kann, ist die Summen unabhängig zu berechnen - eine Unterabfrage für Preis und eine Unterabfrage für Gebühren - und dann die Ergebnisse zusammen:

SELECT 
    p.year, 
    p.SumOfPrijs, 
    f.SumOfFees, 
    p.SumOfPrijs + f.SumOfFees AS Total 
FROM (
    SELECT 
    YEAR(vertrekdatum) AS year, 
    SUM(prijs) AS SumOfPrijs 
    FROM gegevens 
    GROUP BY YEAR(vertrekdatum) 
) p 
LEFT JOIN (
    SELECT 
    YEAR(vertrekdatum) as year, 
    SUM(amount) AS SumOfFees 
    FROM gegevens 
    INNER JOIN fees ON gegevens.gegevenID = fees.gegevenID 
    GROUP BY YEAR(vertrekdatum) 
) f ON p.year = f.year 

Es gibt eine SQL Fiddle here.

+0

Hi Ed. Danke für deine Hilfe dazu. Diese Abfrage hat genau das gemacht, was ich mir erhofft hatte. Ich habe viel zu lernen... –

Verwandte Themen