Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Reason for Column is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause [duplicate]

I got an error -

Column 'Employee.EmpID' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.


select loc.LocationID, emp.EmpID from Employee as emp full join Location as loc  on emp.LocationID = loc.LocationID group by loc.LocationID  

This situation fits into the answer given by Bill Karwin.

correction for above, fits into answer by 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  

ORIGINAL QUESTION -

For the SQL query -

select * from Employee as emp full join Location as loc  on emp.LocationID = loc.LocationID group by (loc.LocationID) 

I don't understand why I get this error. All I want to do is join the tables and then group all the employees in a particular location together.

I think I have a partial explanation for my own question. Tell me if its ok -

To group all employees that work in the same location we have to first mention the LocationID.

Then, we cannot/do not mention each employee ID next to it. Rather, we mention the total number of employees in that location, ie we should SUM() the employees working in that location. Why do we do it the latter way, i am not sure. So, this explains the "it is not contained in either an aggregate function" part of the error.

What is the explanation for the GROUP BY clause part of the error ?

like image 763
david blaine Avatar asked Dec 22 '12 03:12

david blaine


People also ask

What is invalid in the select list because it is not contained in either an aggregate function or GROUP BY clause over?

Basically, what this error is saying is that if you are going to use the GROUP BY clause, then your result is going to be a relation/table with a row for each group, so in your SELECT statement you can only "select" the column that you are grouping by and use aggregate functions on that column because the other columns ...

What is an aggregate function in SQL?

An aggregate function performs a calculation on a set of values, and returns a single value. Except for COUNT(*) , aggregate functions ignore null values. Aggregate functions are often used with the GROUP BY clause of the SELECT statement. All aggregate functions are deterministic.

What are aggregate functions in database?

In database management, an aggregate function or aggregation function is a function where the values of multiple rows are grouped together to form a single summary value. Common aggregate functions include: Average (i.e., arithmetic mean) Count.

Can we use GROUP BY without aggregate function in SQL Server?

You can use the GROUP BY clause without applying an aggregate function.


2 Answers

Suppose I have the following table T:

a   b -------- 1   abc 1   def 1   ghi 2   jkl 2   mno 2   pqr 

And I do the following query:

SELECT a, b FROM T GROUP BY a 

The output should have two rows, one row where a=1 and a second row where a=2.

But what should the value of b show on each of these two rows? There are three possibilities in each case, and nothing in the query makes it clear which value to choose for b in each group. It's ambiguous.

This demonstrates the single-value rule, which prohibits the undefined results you get when you run a GROUP BY query, and you include any columns in the select-list that are neither part of the grouping criteria, nor appear in aggregate functions (SUM, MIN, MAX, etc.).

Fixing it might look like this:

SELECT a, MAX(b) AS x FROM T GROUP BY a 

Now it's clear that you want the following result:

a   x -------- 1   ghi 2   pqr 
like image 179
Bill Karwin Avatar answered Sep 19 '22 11:09

Bill Karwin


Your query will work in MYSQL if you set to disable ONLY_FULL_GROUP_BY server mode (and by default It is). But in this case, you are using different RDBMS. So to make your query work, add all non-aggregated columns to your GROUP BY clause, eg

SELECT col1, col2, SUM(col3) totalSUM FROM tableName GROUP BY col1, col2 

Non-Aggregated columns means the column is not pass into aggregated functions like SUM, MAX, COUNT, etc..

like image 22
John Woo Avatar answered Sep 17 '22 11:09

John Woo