Зачем нам нужна GROUP BY с AGGREGATE FUNCTIONS? - программирование
Подтвердить что ты не робот

Зачем нам нужна GROUP BY с AGGREGATE FUNCTIONS?

Я увидел пример, где был список (таблица) сотрудников с их ежемесячной зарплатой. Я сделал сумму зарплат и увидел ту же таблицу в обороте!!! Это было странно.

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

SELECT EmployeeID, SUM (MonthlySalary) 
FROM Employee
GROUP BY EmpID

Я знаю, что получаю сообщение об ошибке, если я не использую группу в приведенном выше коде. Это то, чего я не понимаю -

Мы выбираем employeeid из таблицы сотрудников. SUM() сообщается, что он должен добавить столбец MonthlySalary из таблицы Employee. Таким образом, он должен сразу перейти и добавить эти числа вместо группировки, а затем добавить их.

Вот как это сделает человек - посмотрите на таблицу сотрудников и добавьте все числа. Почему он взял на себя труд, чтобы сгруппировать их, а затем добавить их?

4b9b3361

Ответ 1

Это может быть проще, если вы думаете о GROUP BY как "для каждого" для объяснения. Запрос ниже:

SELECT empid, SUM (MonthlySalary) 
FROM Employee
GROUP BY EmpID

говорит:

"Дайте мне сумму MonthlySalary для каждого empid"

Итак, если ваша таблица выглядит так:

+-----+------------+
|empid|MontlySalary|
+-----+------------+
|1    |200         |
+-----+------------+
|2    |300         |
+-----+------------+

результат:

+-+---+
|1|200|
+-+---+
|2|300|
+-+---+

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

+-----+------------+
|empid|MontlySalary|
+-----+------------+
|1    |200         |
+-----+------------+
|1    |300         |
+-----+------------+
|2    |300         |
+-----+------------+

результат:

+-+---+
|1|500|
+-+---+
|2|300|
+-+---+

Тогда это будет потому, что есть два empid 1, чтобы суммировать их. Не уверен, помогает ли это объяснение, но я надеюсь, что это немного упростит ситуацию.

Ответ 2

Если вы хотите добавить все числа, у вас не будет GROUP BY:


SELECT SUM(MonthlySalary) AS TotalSalary
FROM Employee
+-----------+
|TotalSalary|
+-----------+
|777400     |
+-----------+

Точка GROUP BY заключается в том, что вы получаете отдельную сумму для каждого сотрудника.

+--------+------+
|Employee|Salary|
+--------+------+
|John    |123400|
+--------+------+
|Frank   |413000|
+--------+------+
|Bill    |241000|
+--------+------+

Ответ 3

Печально то, что есть одна база данных, которая поддерживает синтаксис, который вы предлагаете:

SELECT EmployeeID, SUM (MonthlySalary) 
FROM Employee

Однако MySQL не делает то, что вы ожидаете. Он возвращает общую сумму MonthlySalary для всех и один произвольный EmployeeId. Увы.

Ваш вопрос о синтаксисе SQL. Ответ заключается в том, как SQL был определен, и он не изменится. Определение полей агрегации из предложения SELECT не является необоснованным, но это не так, как этот язык определен.

Однако у меня есть некоторое сочувствие к этому вопросу. Многие люди, изучающие SQL, думают о "группировке" как о чем-то, что делается в контексте сортировки строк. Что-то вроде "сортировать города в США и группировать их по состоянию на выходе". Имеет смысл. Но "group by" в SQL действительно означает "суммировать", а не "держать вместе".

Ответ 4

Если вы не укажете GROUP BY, агрегатные функции работают по всем выбранным записям. В этом случае нет смысла также выбирать конкретный столбец, например EmployeeID. Либо вы хотите, чтобы сумма на одного сотрудника составлялась, и в этом случае вы выбираете идентификатор сотрудника и группу для сотрудника, или хотите получить общую сумму по всей таблице, поэтому вы не указываете идентификатор сотрудника и предложение GROUP BY.

В вашем запросе, если вы не укажете GROUP BY, какой идентификатор сотрудника вы хотите отобразить?