2012-07-06 4 views
5

Ich habe eine Tabelle der Einnahmen alsMysql verbinden und die Summe verdoppelt Ergebnis

title_id  revenue cost 
    1   10  5 
    2   10  5 
    3   10  5 
    4   10  5 
    1   20  6      
    2   20  6 
    3   20  6 
    4   20  6 

wenn ich führen Sie diese Abfrage

SELECT SUM(revenue),SUM(cost) 
FROM revenue 
GROUP BY revenue.title_id 

es Ergebnis

title_id  revenue cost 
    1   30  11 
    2   30  11 
    3   30  11 
    4   30  11 

, das in Ordnung erzeugt ist, Jetzt möchte ich das Summenergebnis mit einer anderen Tabelle kombinieren, die eine solche Struktur

hat
title_id  interest  
    1   10   
    2   10   
    3   10   
    4   10   
    1   20        
    2   20   
    3   20   
    4   20   

, wenn ich mit Aggregatfunktion wie diese

SELECT SUM(revenue),SUM(cost),SUM(interest) 
FROM revenue 
LEFT JOIN fund ON revenue.title_id = fund.title_id 
GROUP BY revenue.title_id,fund.title_id  

beitreten ausführen es das doppelte Ergebnis

title_id  revenue cost interest 
    1   60  22  60 
    2   60  22  60 
    3   60  22  60 
    4   60  22  60 

Ich kann nicht verstehen, warum es sie doppelt so hoch ist, helfen Sie bitte

Antwort

11

Seine Verdopplung, weil Sie Titel in Fonds und Umsatz Tabellen wiederholt haben. Dies multipliziert die Anzahl der Datensätze, wo es übereinstimmt. Das ist ziemlich einfach zu sehen, wenn Sie die Aggregatfunktionen entfernen und die Rohdaten betrachten.

Der Weg, um dies zu umgehen ist inline Ansichten Ihrer Aggregate erstellen und beitreten diese Ergebnisse.

SELECT R.title_id, 
     R.revenue, 
     R.cost, 
     F.interest 
FROM (SELECT title_id, 
       Sum(revenue) revenue, 
       Sum(cost) cost 
     FROM revenue 
     GROUP BY revenue.title_id) r 
     LEFT JOIN (SELECT title_id, 
         Sum(interest) interest 
        FROM fund 
        GROUP BY title_id) f 
       ON r.title_id = F.title_id 

Ausgang

| TITLE_ID | REVENUE | COST | INTEREST | 
---------------------------------------- 
|  1 |  30 | 11 |  30 | 
|  2 |  30 | 11 |  30 | 
|  3 |  30 | 11 |  30 | 
|  4 |  30 | 11 |  30 | 

demo

+0

Gibt es dafür hohe Leistungskosten? –

1

Für jede title_id in der Umsatztabelle gibt es zwei Zeilen.

3

Der Grund dafür ist, dass man ohne Gruppierung es die ersten abgeleitete Tabelle aus der zweiten Tabelle verbunden den Tisch. Um das Problem zu lösen, gruppieren Sie die zweite Tabelle (fund) und verknüpfen Sie sie mit der ersten abgeleiteten Tabelle, die LEFT JOIN verwendet.

SELECT b.title_id, 
     b.TotalRevenue, 
     b.TotalCost, 
     d.TotalInterest 
FROM 
(
    SELECT a.title_id, 
      SUM(a.revenue) TotalRevenue, 
      SUM(a.cost) TotalCost 
    FROM  revenue a 
    GROUP BY a.title_id 
) b LEFT JOIN 
(
    SELECT c.title_id, 
      SUM(a.interest) TotalInterest 
    FROM  fund c 
    GROUP BY c.title_id 
) d ON b.title_id = d.title_id