2012-07-06 42 views
5

我有收入的一個表作爲Mysql的加入和總和翻一番結果

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 

當我執行此查詢

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

它產生的結果

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

這是確定,現在我想結合總結果與另一個表具有這樣的結構

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

當我執行加入像這樣

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  

聚合函數,雙擊它,結果

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

我不明白爲什麼會加倍,請幫助

回答

11

由於您在基金和收入表中重複了標題,所以其翻倍。這將匹配的記錄數乘以。如果您刪除聚合函數並查看原始數據,這很容易看出。 See here

解決此問題的方法是創建聚合的內聯視圖並加入這些結果。

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 

輸出

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

demo

+0

這是否有任何大的性能成本? – 2016-03-04 17:08:36

1

收入表中的每個title_id都有兩行。

3

這樣做的原因是,你有加入表中的第一派生表從第二個表不進行分組它。要解決該問題,請將第二個表(fund)分組,並使用LEFT JOIN與第一個派生表一起加入。

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