2013-08-09 41 views
8

Sto cercando di determinare come fare campi somma tra due tabelle.SUM Query per due campi in due tabelle diverse

Nella tabella 1, che chiameremo Informazioni delle in breve, avrei, per esempio, gegevenID, vertrekdatum, prijs

nella tabella 2, che chiameremo tasse, avrei, per esempio , feeID, gegevenID, importo

voglio prendere e sommare i valori per Prijs basati su anno (vertrekdatum) da gegevens.

Avevo provato a fare un SINISTRA SINISTRA e ha funzionato fino a quando c'erano due record per lo stesso gegevenID nel tavolo della commissione., Poi ha raddoppiato i prijs.

Tabella esempio:

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| 
---------------------------- 

I risultati che ho voglio sono

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

Questa query ha provocato la raddoppiato 'Prijs' quando ha preso in considerazione ci sono stati due file nel prezzo tabella per un 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) 

Ogni pensiero sarebbe fantastico.

risposta

12

È necessario utilizzare una sottoquery per aggregare la tavola tasse prima il 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); 

Il problema è che le molteplici commissioni su su "gegeven" sta causando il join per la produzione di file inaspettati, che influiscono sulla somma.

+0

questo è perfetto. grazie mille per l'aiuto avevo provato una simile opzione, ma non voleva cedere alcun risultato se non ci fossero valori riportati nella tabella tassa che corrispondeva alla gegevenID nella tabella tbl_vluchtgegevens. –

+1

Potrebbe essere bello a 'accettare' questa come la risposta – Strawberry

3

Unire in qualsiasi forma raddoppierà i valori quando ci sono due righe gegevenID in fees (o triplicare se ce ne sono tre e così via).

La soluzione migliore mi viene in mente è quello di calcolare le somme in modo indipendente - una subquery per il prezzo e una subquery per le tasse - e poi mettere insieme i risultati:

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 

C'è un violino SQL here.

+0

Hi Ed. Grazie per il tuo aiuto su questo. Questa query ha fatto esattamente ciò che speravo. Ho molto da imparare ... –

Problemi correlati