Reputation: 25
Let's say I have a table with
student | Marks |
---|---|
john | 30 |
ron | 40 |
I have to write a query which gives me output as student name and avg(marks column)+standardeviation(marks column) or 0 , if student marks is greater than avg(marks column)+standardeviation(marks column) then avg(marks column)+standardeviation(marks column) else 0
I have written a query but it does not work
select student, case when marks>(select avg(marks)+stddev_pop(marks) from students) then avg(marks column)+standardeviation(marks column) when marks=(select avg(marks)+stddev_pop(marks) then marks else 0 end as final_marks from students
Please can anyone suggest any way
Upvotes: 0
Views: 369
Reputation: 1270181
Close. Use window functions. And in MySQL, you don't need a case
because booleans are supported:
select s.student,
(s.marks > avg(s.marks) over () + stddev_pop(s.marks) over ()) as final_marks
from students s;
In older versions of MySQL, I would recommend a subquery in the from
clause:
select s.*,
(s.marks > ss.avg_marks + ss.stddev_pop_marks) as final_marks
from students s cross join
(select avg(s.marks) as avg_marks,
stddev_pop(s.marks) as stddev_pop_marks
from students
) ss
Upvotes: 1