2014-02-06 3 views
0

У меня есть три стола: пользователи, продажи и очки.Суммируя значения по нескольким несвязанным таблицам?

Каждый пользователь имеет несколько продаж и несколько точек.

продаж есть столбец «значение» и точки есть столбец «оценка», как и

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

Вы должны использовать подзапросы , Почему бы вам не использовать их? –

+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; 
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 
Смежные вопросы