我有三个表:用户,销售和积分。
每个用户都有多个销售点和多个点。
销售有一个列“值”,点有一个“得分”列,如此
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 . . .
是否可以在一个查询中实现,而不使用子查询?
或者什么是最好的,最简单的方法?我试图尽可能地简化这个,因为我有很多与用户相关的信息,我必须以这种方式展示。
我尝试使用左连接但是当我在一个查询中连接两个一对多表时,由于重复的行,总和显然变得混乱。我尝试对数据进行分组,但我认为我迷失了。
答案 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