sql - sintaxis - porque no está contenida en una función de agregado ni en la cláusula group by.
¿Por qué necesitamos GROUP BY con AGREGAR FUNCIONES? (4)
Vi un ejemplo donde había una lista (tabla) de empleados con sus respectivos salarios mensuales. ¡Hice una suma de los salarios y vi exactamente la misma tabla en la salida! Eso fue extraño.
Esto es lo que se debe hacer: tenemos que averiguar cuánto dinero pagamos este mes como salarios de los empleados. Para eso, necesitamos sumar los montos de sus sueldos en la base de datos como se muestra:
SELECT EmployeeID, SUM (MonthlySalary)
FROM Employee
GROUP BY EmpID
Sé que recibo un error si no uso group by en el código anterior. Esto es lo que no entiendo -
Estamos seleccionando employeeid de la tabla de empleados. Se le dice a SUM () que debe agregar la columna MonthlySalary, de la tabla Employee. Por lo tanto, debe ir directamente y sumar esos números en lugar de agruparlos y luego sumarlos.
Así es como lo haría una persona: mire la tabla de empleados y agregue todos los números. ¿Por qué se tomaría la molestia de agruparlos y luego sumarlos?
Lo triste es que hay una base de datos que admite la sintaxis que está sugiriendo:
SELECT EmployeeID, SUM (MonthlySalary)
FROM Employee
Sin embargo, MySQL no hace lo que esperas. Devuelve la suma global de MonthlySalary para todos, y un EmployeeId arbitrario. Ay.
Su pregunta es sobre la sintaxis SQL. La respuesta es que es cómo se ha definido SQL, y no va a cambiar. Determinar los campos de agregación de la cláusula SELECT
no es irrazonable, pero no es así como se define este lenguaje.
Sin embargo, tengo cierta simpatía por la pregunta. Mucha gente que aprende sobre SQL piensa en "agrupar" como algo que se hace en el contexto de ordenar las filas. Algo así como "ordenar las ciudades en los Estados Unidos y agruparlas por estado en la salida". Tiene sentido. Pero "agrupar por" en SQL realmente significa "resumir por" no "mantener juntos".
Podría ser más fácil si piensa en GROUP BY como "para cada uno" por el bien de la explicación. La consulta a continuación:
SELECT empid, SUM (MonthlySalary)
FROM Employee
GROUP BY EmpID
esta diciendo:
"Dame la suma de MonthlySalary''s para cada empid"
Así que si tu mesa se viera así:
+-----+------------+
|empid|MontlySalary|
+-----+------------+
|1 |200 |
+-----+------------+
|2 |300 |
+-----+------------+
resultado:
+-+---+
|1|200|
+-+---+
|2|300|
+-+---+
La suma no parece hacer nada porque la suma de un número es ese número. Por otro lado si se viera así:
+-----+------------+
|empid|MontlySalary|
+-----+------------+
|1 |200 |
+-----+------------+
|1 |300 |
+-----+------------+
|2 |300 |
+-----+------------+
resultado:
+-+---+
|1|500|
+-+---+
|2|300|
+-+---+
Entonces sería porque hay dos empid 1 para sumar. No estoy seguro de si esta explicación ayuda o no, pero espero que haga las cosas un poco más claras.
Si no especifica GROUP BY
, las funciones agregadas operan sobre todos los registros seleccionados. En ese caso, no tiene sentido seleccionar también una columna específica como EmployeeID
. O bien desea los totales por empleado, en cuyo caso selecciona la ID del empleado y el grupo por empleado, o desea un total en toda la tabla, por lo que omite la ID del empleado y la cláusula GROUP BY
.
En su consulta, si omite el GROUP BY
, ¿qué ID de empleado le gustaría mostrar?
Si quisiera sumar todos los números, no tendría un GRUPO POR:
SELECT SUM(MonthlySalary) AS TotalSalary
FROM Employee
+-----------+
|TotalSalary|
+-----------+
|777400 |
+-----------+
El punto de GROUP BY es que obtiene un total separado para cada empleado.
+--------+------+
|Employee|Salary|
+--------+------+
|John |123400|
+--------+------+
|Frank |413000|
+--------+------+
|Bill |241000|
+--------+------+