Зачем нам нужна GROUP BY с AGGREGATE FUNCTIONS?
Я увидел пример, где был список (таблица) сотрудников с их ежемесячной зарплатой. Я сделал сумму зарплат и увидел ту же таблицу в обороте!!! Это было странно.
Вот что нужно сделать - нам нужно выяснить, сколько денег мы платим в этом месяце за зарплату сотрудников. Для этого нам нужно суммировать суммы зарплаты в базе данных, как показано -
SELECT EmployeeID, SUM (MonthlySalary)
FROM Employee
GROUP BY EmpID
Я знаю, что получаю сообщение об ошибке, если я не использую группу в приведенном выше коде. Это то, чего я не понимаю -
Мы выбираем employeeid из таблицы сотрудников. SUM() сообщается, что он должен добавить столбец MonthlySalary из таблицы Employee. Таким образом, он должен сразу перейти и добавить эти числа вместо группировки, а затем добавить их.
Вот как это сделает человек - посмотрите на таблицу сотрудников и добавьте все числа. Почему он взял на себя труд, чтобы сгруппировать их, а затем добавить их?
Ответы
Ответ 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
, какой идентификатор сотрудника вы хотите отобразить?