Объединение трех столов, затем группы - PullRequest
1 голос
/ 16 февраля 2011

Я собираюсь объединить три таблицы и затем сложить один столбец, умноженный на значение из другого.

SELECT t1.column, t2.column, SUM(t1.column * t2.column)
FROM table1 t1 
     INNER JOIN table2 t2 
         ON t1.id = t2.id 
     JOIN table3 t3 
         ON t2.id = t3.id 
GROUP BY t1.column, t2.column;

Этот запрос выполняет то, что я хочу, НО я не понимаю, почему работает GROUP BY?

Если я добавлю столбцы в выборку, я должен также добавить столбцы в группу с помощью?

Ответы [ 6 ]

4 голосов
/ 16 февраля 2011

Вы действительно знаете, что делаете здесь?

SELECT t1.column, t2.column, SUM(t1.column * t2.column)
FROM table1 t1
INNER JOIN table2 t2 ON t1.id = t2.id
JOIN table3 t3 ON t2.id = t3.id
GROUP BY t1.column, t2.column;

Запрос очень подозрительный, по крайней мере, двумя способами:

  • Таблица3 не используется - за исключением проверки наличия записи в t3 для идентификатора в t2. Ты этого хотел? Potential pitfall Если имеется несколько записей T3 на одну запись t2, вы получите декартово произведение , непреднамеренное умножение столбца SUM.

  • GROUP BY t1.column, t2.column - это объединяет все уникальные комбинации (t1.column, t2.column) и суммирует результат t1.column * t2.column через них. Это действительно то, что вы после?

Для пункта 2 рассмотрим эти (исходные) данные:

t1.id, t1.column, t2.column, t1.column*t2.column
1      2          3          6
2      2          3          6
3      3          3          9
4      3          4          12

В итоге вы получите

t1.column, t2.column, SUM(t1.column*t2.column)
2          3          12
3          3          9
3          4          12

Смотрите, что (2,3) сложило сумму.

Если я добавлю столбцы в выборку, я также должен добавить столбцы в группу с помощью.

Столбцы в SELECT (за исключением некоторых СУБД, таких как MySQL) должны быть либо агрегатом (например, sum / avg / min / max), либо столбцом в предложении GROUP BY. Существуют и другие выражения, которые вы можете использовать, например, скалярные функции или значения констант, а не из таблиц.

Если вам действительно нужно больше столбцов из таблицы , относящихся к агрегатам, вам необходимо четко подумать о почему . например Если вы группируете по столбцу 1 и усредняющему столбцу 2, что вы будете делать с столбцом 3 - из какой строки он должен появиться?

1 голос
/ 16 февраля 2011

Сначала не беспокойтесь о JOIN с.Чтобы понять GROUP BY, сначала посмотрите на очень простой запрос.

SELECT t1.year, t1.person
FROM table t1

Это вернет

year | person
2000 | Joe
2000 | Betty
2000 | Marty
2001 | Joe
2002 | Betty

Если вы добавите агрегатную функцию, вы должны включить GROUP BY для всего, что не охвачено статистической функцией.

SELECT t1.year, COUNT(t1.person) as counter
FROM table t1
GROUP BY t1.year
year | counter
2000 | 3
2001 | 1
2002 | 1

Если вы не включите GROUP BY, он не будет работать, потому что база данных буквально не знает, как вы хотите группироватьваши данные.

1 голос
/ 16 февраля 2011

Это потому, что SUM является агрегирующей функцией, которая рассчитывается по результату каждой группы.

0 голосов
/ 16 февраля 2011

Поскольку функции агрегирования дают одно возвращаемое значение ...

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

0 голосов
/ 16 февраля 2011

Столбцы, являющиеся целью агрегатных функций , не обязательно должны быть частью предложения GROUP BY. Агрегатные функции - это такие функции, как SUM, AVG, MIN, MAX и т. Д.

0 голосов
/ 16 февраля 2011

Когда GROUP BY имеет более 1 параметра, как в вашем случае, это означает «Сначала сортируйте по определению № 1, и если существует несколько определений № 1, то сортируйте по определению № 2, если существует несколько определений № 2». затем сгруппируйте их вместе. ".

...