2014-10-09 3 views
1

У меня есть более или два менее идентичные таблицы:функции SQL AVG на нескольких таблиц

test_score

id int(11) PK AI 
user_id int(11) 
module_id int(11) 
score double 
number_correct int(11) 
correct_total int(11) 
timestamp datetime 
phase_id int(11) 
medal_id int(11) 
team_id int(11) 
status_id int(11) 

И

id int(11) PK AI 
user_id int(11) 
module_id int(11) 
score double 
number_correct int(11) 
correct_total int(11) 
timestamp datetime 
phase_id int(11) 
medal_id int(11) 
team_id int(11) 
status_id int(11) 

Теперь причина этих двух быть настолько идентичны, что они содержат данные из каждого своего компонента в моей системе.

Теперь я хочу использовать функцию AVG(), чтобы найти средний балл этих двух таблиц в сочетании.

это возможно?

+0

создать представление с 'union' и использовать' ср() 'на представлении , или без представления, 'avg()' функция на 'union'. –

+0

Какие СУБД вы используете? –

ответ

4
SELECT user_id, average_score = AVG(score) 
FROM (
    SELECT user_id, score FROM test_score1 
    UNION ALL 
    SELECT user_id, score FROM test_score2 
) AS subquery 
GROUP BY user_id 
+0

Можете ли вы объяснить test_score1 и test_score2? –

+0

Это имена ваших таблиц, имеющих идентичные схемы. –

3

Остановить мышление с точки зрения таблиц, а скорее «наборов результатов».

Разбейте проблему на две составляющие ..

Во-первых, как создать «результирующий набор» данные, которые я хочу от этих двух таблиц? решения Простейшего, то союза заявления

select * from <table1> 
union 
select * from <table2> 

Теперь возьмите выше результирующий набор и вычислить среднее

select xx.module_id,avg(xx.score) as AvgModuleScore 
from 
(
    select * from <table1> 
    union 
    select * from <table2> 
) xx 
+0

Вы должны использовать 'UNION ALL'. Да, мы, кажется, выбираем таблицы, имеющие первичные или уникальные ключи, но если нет, то неявное 'DISTINCT' оператора' UNION' исказит результаты 'AVG()'. –

+0

Спасибо Бэкон Битс, хорошая точка ... – Sparky

Смежные вопросы