mysql - Create Stored Procedure with Case Statement -


i trying create stored procedure , seem getting wrong. use sql when need to, please forgive dev , out. want include in stored procedure sql query inner join between 2 tables: user_students , student_grades_summary. here stored procedure wrote:

create procedure gradestudents( in scoreover100 float, out s_grade char(3)) begin  case         when (student_grades_summary.aggregate >= 80 && student_grades_summary.aggregate <= 100 && student_grades_summary.level = 'jss')             set student_grades_summary.grade = 'a1';         when(student_grades_summary.aggregate >= 70 , student_grades_summary.aggregate <= 79 , student_grades_summary.level = 'jss')             set student_grades_summary.grade = 'b1';         when (student_grades_summary.aggregate >= 60 , student_grades_summary.aggregate <= 69 , student_grades_summary.level = 'jss')             set student_grades_summary.grade = 'b2';         when(student_grades_summary.aggregate >= 55 , student_grades_summary.aggregate <= 59 , student_grades_summary.level = 'jss')             set student_grades_summary.grade = 'p1';         when(student_grades_summary.aggregate >= 50 , student_grades_summary.aggregate <= 54 , student_grades_summary.level = 'jss')             set student_grades_summary.grade = 'p2';         when(student_grades_summary.aggregate <= 49 , student_grades_summary.level = 'jss')             set student_grades_summary.grade = 'f';         when(student_grades_summary.aggregate >= 85 , student_grades_summary.aggregate <= 100 , student_grades_summary.level = 'sss')             set student_grades_summary.grade = 'a1';         when(student_grades_summary.aggregate >= 80 , student_grades_summary.aggregate <= 84 , student_grades_summary.level = 'sss')             set student_grades_summary.grade = 'b2';         when(student_grades_summary.aggregate >= 75 , student_grades_summary.aggregate <= 79 , student_grades_summary.level = 'sss')             set student_grades_summary.grade = 'b3';         when(student_grades_summary.aggregate >= 70 , student_grades_summary.aggregate <= 74 , student_grades_summary.level = 'sss')             set student_grades_summary.grade = 'c4';         when(student_grades_summary.aggregate >= 65 , student_grades_summary.aggregate <= 69 , student_grades_summary.level = 'sss')             set student_grades_summary.grade = 'c5';         when(student_grades_summary.aggregate >= 60 , student_grades_summary.aggregate <= 64 , student_grades_summary.level = 'sss')             set student_grades_summary.grade = 'c6';         when(student_grades_summary.aggregate >= 55 , student_grades_summary.aggregate <= 59 , student_grades_summary.level = 'sss')             set student_grades_summary.grade = 'd7';         when(student_grades_summary.aggregate >= 50 , student_grades_summary.aggregate <= 54 , student_grades_summary.level = 'sss')             set student_grades_summary.grade = 'e8';         when(student_grades_summary.aggregate <= 49 , student_grades_summary.level = 'sss')             set student_grades_summary.grade = 'f9'; end case; 

and sql query trying include stored procedure in. trying add values grade column in student_grades_summary using stored procedure. anyways here sql:

select user_students.fname firstname, user_students.lname lastname      , student_grades_summary.subject coresubjects      , student_grades_summary.aggregate scoreover100      , student_grades_summary.subjectrank position      , student_grades_summary.term term      , student_grades_summary.level level      , student_grades_summary.class class      , student_grades_summary.section section      , student_grades_summary.session session student_grades_summary  join user_students     on student_grades_summary.level = user_students.level     , student_grades_summary.class = user_students.class     , student_grades_summary.section = user_students.section  join config_grades     on student_grades_summary.level = config_grades.level  user_students.level = 'jss'     , user_students.class = '2'     , student_grades_summary.session = '2015/2016' 

so in phpmyadmin, lot of red squiggly lines saying there error in sql. have tried @ code , find error haven't been able to.

i see time , time again. not thinking in sql. in sql need think in sets. don't think in sub-routines think in sets. in case set list of criteria grade, can represent table (i'll call grade_lookup)

aggmin aggmax lvl   grade 80       100  'jss' 'a1'       70       79   'jss' 'b1' 60       69   'jss' 'b2' 55       59   'jss' 'p1' 50       54   'jss' 'p2' 0        49   'jss' 'f'  85       100  'sss' 'a1'  80       84   'sss' 'b2' 75       79   'sss' 'b3' 70       74   'sss' 'c4' 65       69   'sss' 'c5' 60       64   'sss' 'c6' 55       59   'sss' 'd7' 50       54   'sss' 'e8' 0        49   'sss' 'f9' 

once have grade_lookup table join , grade -- no function call needed -- this:

select user_students.fname firstname, user_students.lname lastname      , s.subject coresubjects      , s.aggregate scoreover100      , s.subjectrank position      , s.term term      , s.level level      , s.class class      , s.section section      , s.session session       -- result of our lookup      , coalesce(l.grade ,'lookup fail') grade  student_grades_summary s join user_students     on student_grades_summary.level = user_students.level     , student_grades_summary.class = user_students.class     , student_grades_summary.section = user_students.section  join config_grades     on student_grades_summary.level = config_grades.level   -- join grade lookup left join grade_lookup l on s.aggregate >= l.aggmin                     , s.aggregate <= l.aggmax                     , s.level = l.lvl  user_students.level = 'jss'     , user_students.class = '2'     , student_grades_summary.session = '2015/2016' 

note, stuck select statement -- i've no idea if select statement correct or not -- don't consider re-using example code validation of it's correctness.


Comments