So what im trying to do is this but this doesn’t work:
Select count(staffno)as total_staff,avg(salary),branchno From staff Where total_staff > 1 Group by branchno
Here is another example:
Select salary,salary*1.015 as proposed_salary From staff Where proposed_salary > 50000
Advertisement
Answer
You can’t use an aggregate expression (sum(), count(), …) in the where clause of the query. This clause is evaluated before rows are grouped together by the group by clause, so the aggregates are not yet available.
In SQL, that’s the purpose of the having clause:
select count(staffno) as total_staff, avg(salary), branchno from staff having count(staffno) > 1 -- MySQL also allows "total_staff > 1" group by branchno
As for the second query: the alias defined in the select clause is not available in the where clause either (for the same reason as above). You can repeat the expression:
select salary, salary * 1.015 as proposed_salary from staff where salary * 1.015 > 50000
Or you can use a derived table (cte or subquery):
select *
from (
select salary, salary * 1.015 as proposed_salary
from staff
) t
where proposed_salary > 5000