В общем, если мы хотим вернуть агрегаты (SUM, AVG), а также вернуть детали, которые составляют агрегат, мы обычно используем два SELECT
. В качестве элементарного примера рассмотрим таблицу «test_score»
test_id student_id score
------- ---------- -----
101 6 90
101 7 71
101 8 88
222 6 93
222 7 78
222 8 81
Мы можем рассчитать среднюю оценку для каждого теста с помощью запроса SELECT ... GROUP BY
.
SELECT r.test_id AS test_id
, AVG(r.score) AS avg_score
, MAX(r.score) AS high_score
FROM test_score r
GROUP
BY r.test_id
Мы ожидаем, что мы вернем набор результатов, подобный следующему:
test_id avg_score
------- ---------
101 83
222 84
Мы можем использовать этот запрос как встроенное представление , то есть мы заключаем его в скобки и ссылаться на него, как на таблицу в предложении FROM другого SELECT.
В качестве демонстрации, чтобы вернуть оценки студентов, которые были лучше (или равны) средним для каждого теста:
SELECT s.test_id
, s.avg_score
, t.student_id
, t.score
FROM ( -- inline view to get average score for each test_id
SELECT r.test_id AS test_id
, AVG(r.score) AS avg_score
FROM test_score r
GROUP
BY r.test_id
) s
LEFT
JOIN test_score t
ON t.test_id = s.test_id
AND t.score >= s.avg_score
ORDER
BY t.test_id
, s.score DESC
И мы ожидаем, что он вернет что-то вроде:
test_id avg_score student_id score
------- --------- ---------- -----
101 83 6 90
101 83 8 88
222 84 6 93
Первые два столбца, возвращенные из встроенного представления, являются результатом агрегата (AVG). Последние два столбца являются строками подробностей, сопоставленными со строками из совокупного результата.
Подводя итог основной точке зрения:
Чтобы вернуть агрегаты вместе с подробностями, нам обычно требуется два SELECT.
Один SELECT для получения агрегатов (с GROUP BY, если агрегаты «за» что-то или другое)
Другой SELECT для получения деталей и соответствия агрегату.