Использование группировки по нескольким столбцам


1037

Я понимаю смысл GROUP BY x

Но как GROUP BY x, yработает, и что это значит?


2
Вы не найдете это описанным, поскольку этот вопрос излагает это. Предложение GROUP BY может содержать одно или несколько полей. GROUP BY клиент; GROUP BY фамилия, имя; GROUP BY год, магазин, sku и т. Д.
Билл

Ответы:


2029

Group By Xозначает положить всех тех, кто имеет одинаковое значение для X в одну группу .

Group By X, Yозначает, что все те же с одинаковыми значениями для X и Y в одной группе .

Чтобы проиллюстрировать это на примере, скажем, у нас есть следующая таблица, чтобы узнать, кто посещает какой предмет в университете:

Table: Subject_Selection

Subject   Semester   Attendee
---------------------------------
ITB001    1          John
ITB001    1          Bob
ITB001    1          Mickey
ITB001    2          Jenny
ITB001    2          James
MKB114    1          John
MKB114    1          Erica

Когда вы используете только group byв теме столбца; сказать:

select Subject, Count(*)
from Subject_Selection
group by Subject

Вы получите что-то вроде:

Subject    Count
------------------------------
ITB001     5
MKB114     2

... потому что есть 5 записей для ITB001 и 2 для MKB114

Если бы мы были group byдве колонки:

select Subject, Semester, Count(*)
from Subject_Selection
group by Subject, Semester

мы бы получили это:

Subject    Semester   Count
------------------------------
ITB001     1          3
ITB001     2          2
MKB114     1          2

Это происходит потому, что когда мы группируем по двум столбцам, это говорит: «Сгруппируйте их так, чтобы все те, у кого один и тот же предмет и семестр, были в одной группе, а затем вычислили все агрегатные функции (Count, Sum, Average и т. Д. ) для каждой из этих групп " . В этом примере это демонстрируется тем фактом, что, когда мы их подсчитываем, три человека делают ITB001 в 1-м семестре, а два - в семестре 2. Оба из MKB114 находятся в 1-м семестре, поэтому нет строка за семестр 2 (данные не вписываются в группу "MKB114, семестр 2")

Надеюсь, это имеет смысл.


11
@Smashery: Значит ли это, что GROUP BY A,Bэто то же самое, что и GROUP BY B,A?
тумчаадитя

23
Да, это так. Я не могу с уверенностью сказать, насколько они эффективны друг с другом, но они дадут тот же результат, да.
Smashery

2
Здесь можно добавить, что существует разница между вторым, GROUP BY a, bи GROUP BY a AND bпоскольку во втором списке перечислены только сгруппированные элементы с одинаковым содержанием и без «подгрупп». В этом случае вывод будет таким же, как первый.
Два

5
Я хотел бы добавить, что порядок, в котором вы группируете столбцы, не имеет значения. В приведенной выше группе примеров по семестру субъект должен был дать тот же результат
user2441441

2
ну, группировка по a, b и группировка по b, a НЕ возвращают один и тот же результат - строки отображаются в другом порядке
фанни

33

Предложение GROUP BYиспользуется вместе с агрегатными функциями для группировки результирующего набора по одному или нескольким столбцам. например:

SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name;

Запомните этот порядок:

1) SELECT (используется для выбора данных из базы данных)

2) ОТ (предложение используется для перечисления таблиц)

3) ГДЕ (пункт используется для фильтрации записей)

4) GROUP BY (предложение можно использовать в операторе SELECT для сбора данных по нескольким записям и группировки результатов по одному или нескольким столбцам)

5) HAVING (предложение используется в сочетании с предложением GROUP BY, чтобы ограничить группы возвращаемых строк только теми, чье условие TRUE)

6) ORDER BY (ключевое слово используется для сортировки набора результатов)

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

Агрегатные функции:

MIN возвращает наименьшее значение в данном столбце

SUM возвращает сумму числовых значений в данном столбце

AVG возвращает среднее значение данного столбца

COUNT возвращает общее количество значений в данном столбце

COUNT (*) возвращает количество строк в таблице


1
но где мы помещаем 2 столбца, как агрегировать на основе 2 / более столбцов, это вопрос
Чайтанья

Привет Чайтанья, я не знаю, если это то, что вы спрашиваете, но позвольте мне привести вам лишь несколько примеров. Если у вас есть таблица продуктов, вы используете агрегирующие функции таким образом, ниже приведены два сценария: SELECT AVG (instock) ИЗ продуктов; Это вычислит средние единицы в запасе таблицы продуктов. Теперь вы хотите вычислить единицы в запасе по категории продукта, вам нужно использовать функцию AVG с предложением GROUP BY, например: SELECT categoryId, AVG (instock) ИЗ продуктов GROUP BY categoryId;
С.

Это даже не дает отдаленного ответа на вопрос ... Вопрос заключается в том, как получить «цепную группировку» «субъекта» и «семестра» одновременно, как объясняется в данном примере ...
MahNas92
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.