Mysql join and sum is doubling result

百般思念 提交于 2021-02-04 15:22:21

问题


I have a table of revenue as

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

when i execute this query

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

it produces result

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

which is ok, now i want to combine sum result with another table which has structure like this

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

when i execute join with aggregate function like this

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      

it double the result

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

I can't understand why is it double it,please help


回答1:


Its doubling because you have title repeated in fund and revenue tables. This multiplies the number of records where it matches. This is pretty easy to see if you remove the aggregate functions and look at the raw data. See here

The way to get around this is to create inline views of your aggregates and join on the those results.

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 

output

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

demo




回答2:


The reason for this is that you have joined the table the first derived table from the second table without grouping it. To solve the problem, group the second table (fund) and join it with the first derived table using 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



回答3:


There are two rows for each title_id in revenue table.



来源:https://stackoverflow.com/questions/11364162/mysql-join-and-sum-is-doubling-result

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!