首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mysql join和sum的结果加倍

Mysql join和sum的结果加倍
EN

Stack Overflow用户
提问于 2012-07-06 22:27:51
回答 3查看 9.7K关注 0票数 7

我有一张收入表

代码语言:javascript
复制
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

当我执行这个查询时

代码语言:javascript
复制
SELECT SUM(revenue),SUM(cost)
FROM revenue
GROUP BY revenue.title_id

它会产生结果

代码语言:javascript
复制
title_id     revenue    cost
   1            30        11
   2            30        11
   3            30        11
   4            30        11

这是可以的,现在我想将sum结果与另一个具有如下结构的表结合起来

代码语言:javascript
复制
title_id     interest    
   1            10        
   2            10        
   3            10        
   4            10        
   1            20                            
   2            20        
   3            20        
   4            20        

当我像这样使用聚合函数执行join时

代码语言:javascript
复制
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      

它会使结果加倍

代码语言:javascript
复制
title_id     revenue    cost    interest
   1            60        22       60
   2            60        22       60
   3            60        22       60
   4            60        22       60

我不明白为什么是双倍,请帮帮忙

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-07-06 22:34:31

它加倍是因为你在基金和收入表中有重复的头衔。这将使其匹配的记录数成倍增加。如果您删除聚合函数并查看原始数据,则很容易看出这一点。See here

解决这个问题的方法是创建聚合的内联视图,并在这些结果上进行连接。

代码语言:javascript
复制
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 

输出

代码语言:javascript
复制
| TITLE_ID | REVENUE | COST | INTEREST |
----------------------------------------
|        1 |      30 |   11 |       30 |
|        2 |      30 |   11 |       30 |
|        3 |      30 |   11 |       30 |
|        4 |      30 |   11 |       30 |

demo

票数 14
EN

Stack Overflow用户

发布于 2012-07-06 22:59:54

这样做的原因是,您已将该表与来自第二个表的第一个派生表联接,但没有对其进行分组。要解决此问题,请将第二个表(fund)分组,并使用LEFT JOIN将其与第一个派生表连接。

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2012-07-06 22:34:01

在收入表中,每个title_id都有两行。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11364162

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档