sql - functions - La razón de la columna no es válida en la lista de selección porque no está contenida en una función agregada o en la cláusula GROUP BY
sql group by sum (4)
Posible duplicado:
GRUPO POR / confusión de funciones agregadas en SQL
Tengo un error ...
La columna ''Employee.EmpID'' no es válida en la lista de selección porque no está contenida en una función agregada o en la cláusula GROUP BY.
select loc.LocationID, emp.EmpID
from Employee as emp full join Location as loc
on emp.LocationID = loc.LocationID
group by loc.LocationID
Esta situación encaja con la respuesta dada por Bill Karwin.
Corrección de lo anterior, cabe en respuesta por ExactaBox -
select loc.LocationID, count(emp.EmpID) -- not count(*), don''t want to count nulls
from Employee as emp full join Location as loc
on emp.LocationID = loc.LocationID
group by loc.LocationID
PREGUNTA ORIGINAL
Para la consulta SQL -
select *
from Employee as emp full join Location as loc
on emp.LocationID = loc.LocationID
group by (loc.LocationID)
No entiendo por qué me sale este error. Todo lo que quiero hacer es unir las tablas y luego agrupar a todos los empleados en una ubicación particular.
Creo que tengo una explicación parcial para mi propia pregunta. Dime si esta bien
Para agrupar a todos los empleados que trabajan en la misma ubicación, primero debemos mencionar el ID de ubicación.
Entonces, no podemos / no mencionamos cada ID de empleado al lado. Más bien, mencionamos el número total de empleados en esa ubicación, es decir, debemos SUMAR () a los empleados que trabajan en esa ubicación. ¿Por qué lo hacemos de la última manera? No estoy seguro. Por lo tanto, esto explica la parte del error "no está contenida en ninguna función agregada".
¿Cuál es la explicación de la cláusula GROUP BY
que forma parte del error?
"Todo lo que quiero hacer es unir las tablas y luego agrupar a todos los empleados en una ubicación particular".
Parece que lo que quiere es que la salida de la declaración SQL enumere a todos los empleados de la empresa, pero primero a todas las personas en la oficina de Anaheim, luego a las personas en la oficina de Buffalo, luego a las personas en la oficina de Cleveland (A, B, C, entiéndelo, obviamente no sé qué ubicaciones tienes).
En ese caso, pierda la sentencia GROUP BY. Todo lo que necesitas es ORDER BY loc.LocationID
Básicamente, lo que dice este error es que si va a utilizar la cláusula GROUP BY
, su resultado será una relación / tabla con una fila para cada grupo, por lo que en su declaración SELECT
solo puede "seleccionar" la La columna por la que está agrupando y usa funciones agregadas en esa columna porque las otras columnas no aparecerán en la tabla resultante.
Su consulta funcionará en MYSQL
si configura el modo de servidor ONLY_FULL_GROUP_BY
( y, de forma predeterminada, lo está ). Pero en este caso, está utilizando diferentes RDBMS. Para hacer que su consulta funcione, agregue todas las columnas no agregadas a su cláusula GROUP BY
, por ejemplo
SELECT col1, col2, SUM(col3) totalSUM
FROM tableName
GROUP BY col1, col2
Las columnas no agregadas significan que la columna no se pasa a funciones agregadas como SUM
, MAX
, COUNT
, etc.
Supongamos que tengo la siguiente tabla T
:
a b
--------
1 abc
1 def
1 ghi
2 jkl
2 mno
2 pqr
Y hago la siguiente consulta:
SELECT a, b
FROM T
GROUP BY a
La salida debe tener dos filas, una fila donde a=1
y una segunda fila donde a=2
.
Pero, ¿qué debe mostrar el valor de b en cada una de estas dos filas? Hay tres posibilidades en cada caso, y nada en la consulta deja claro qué valor elegir para b en cada grupo. Es ambiguo
Esto demuestra la regla de valor único , que prohíbe los resultados no definidos que obtiene cuando ejecuta una consulta GROUP BY, e incluye cualquier columna en la lista de selección que no forma parte de los criterios de agrupación, ni aparece en funciones agregadas (SUM, MIN, MAX, etc.).
Arreglarlo podría verse así:
SELECT a, MAX(b) AS x
FROM T
GROUP BY a
Ahora está claro que quieres el siguiente resultado:
a x
--------
1 ghi
2 pqr