2012-07-06 11 views
5

que tienen un cuadro de ingresos comoMysql se unen y la suma se duplica resultado

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 

cuando yo haga esta consulta

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

produce resultado

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

que está bien, Ahora quiero combinar el resultado de la suma con otra tabla que tiene una estructura como esta

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

cuando yo haga unirse con la función agregada como esto

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  

que el doble del resultado

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

No puedo entender por qué es el doble que, por favor ayuda

Respuesta

11

Se está duplicando porque tiene el título repetido en las tablas de ingresos y fondos. Esto multiplica el número de registros donde coincide. Esto es bastante fácil de ver si elimina las funciones agregadas y mira los datos brutos. See here

La forma de evitar esto es crear vistas en línea de sus agregados y unirse a esos resultados.

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 

salida

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

demo

+0

¿Hay algún costo de rendimiento grande para esto? –

1

Hay dos filas para cada title_id en la tabla de ingresos.

3

La razón de esto es que usted tiene unieron la tabla de la mesa primera derivada de la segunda mesa sin agrupar ella. Para resolver el problema, agrupe la segunda tabla (fund) y únala con la primera tabla derivada utilizando 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 
Cuestiones relacionadas