在多个不相关的表上求和值?

时间:2014-02-06 02:45:21

标签: mysql sql join subquery

我有三个表:用户,销售和积分。

每个用户都有多个销售点和多个点。

销售有一个列“值”,点有一个“得分”列,如此

users = | user_id | name |

sales = | sale_id | user_id | value |

points = | point_id | user_id | score |

现在我想显示所有用户的列表,其中包含销售额和点数的总和

user_id | sum(sales.value) | sum(points.value)
1       |   500            |    200
2       |   213            |    132
3  .  .  .

是否可以在一个查询中实现,而不使用子查询?

或者什么是最好的,最简单的方法?我试图尽可能地简化这个,因为我有很多与用户相关的信息,我必须以这种方式展示。

我尝试使用左连接但是当我在一个查询中连接两个一对多表时,由于重复的行,总和显然变得混乱。我尝试对数据进行分组,但我认为我迷失了。

2 个答案:

答案 0 :(得分:1)

SQL中的“正确”方法是在加入表之前对表进行汇总:

select u.user_id, sumvalue, sumscore
from users u left outer join
     (select user_id, sum(value) as sumvalue
      from sales
      group by user_id
     ) s
     on u.user_id = s.user_id left outer join
     (select user_id, sum(score) as sumscore
      from points
      group by user_id
     ) p
     on u.user_id = p.user_id;

答案 1 :(得分:0)

对于以下数据,此sql给出了这些结果 -

user_id user_name
1   Davolio
2   Fuller
3   Leverling
4   Peacock
5   Buchanan
6   Suyama
7   King
8   Callahan
9   Dodsworth

sale_id user_id sale_value
10248   5   $32.38
10249   6   $11.61
10250   4   $65.83
10251   3   $41.34
10252   1   $51.30
10253   3   $58.17
10254   5   $22.98
10255   9   $148.33
10256   3   $13.97
10257   4   $81.91

point_id    user_id score
10319   7   64
10320   5   35
10321   3   3
10322   7   0 
10323   4   5
10324   9   214
10325   1   65
10326   4   78
10327   2   63
10333   5   1
10334   8   9

SELECT users.user_id,
       users.user_name,
       (SELECT SUM(sale_value)  FROM   sales
       WHERE  sales.user_id = users.user_id)  AS SalesValue,
       (SELECT SUM(score)       FROM   points
      WHERE  points.user_id = users.user_id) AS ScoreValue
FROM   users; 

user_id  user_name  SalesValue  ScoreValue
1   Davolio           $51.30    65
2   Fuller                     63
3   Leverling         $113.48   3
4   Peacock           $147.74   83
5   Buchanan          $55.36    36
6   Suyama            $11.61    
7   King                        64
8   Callahan                   9
9   Dodsworth        $148.33    214