簡體   English   中英

使用案例聲明創建存儲過程

[英]Create Stored Procedure with Case Statement

我正在嘗試創建一個存儲過程,但似乎出錯了。 我只在需要時使用SQL,因此請原諒開發人員並提供幫助。 我想在存儲過程中包含一個SQL查詢,該查詢在兩個表之間進行內部聯接:user_students和student_grades_summary。 這是我寫的存儲過程:

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') THEN
            SET student_grades_summary.grade = 'A1';
        WHEN(student_grades_summary.aggregate >= 70 AND student_grades_summary.aggregate <= 79 AND student_grades_summary.level = 'JSS') THEN
            SET student_grades_summary.grade = 'B1';
        WHEN (student_grades_summary.aggregate >= 60 AND student_grades_summary.aggregate <= 69 AND student_grades_summary.level = 'JSS') THEN
            SET student_grades_summary.grade = 'B2';
        WHEN(student_grades_summary.aggregate >= 55 AND student_grades_summary.aggregate <= 59 AND student_grades_summary.level = 'JSS') THEN
            SET student_grades_summary.grade = 'P1';
        WHEN(student_grades_summary.aggregate >= 50 AND student_grades_summary.aggregate <= 54 AND student_grades_summary.level = 'JSS') THEN
            SET student_grades_summary.grade = 'P2';
        WHEN(student_grades_summary.aggregate <= 49 AND student_grades_summary.level = 'JSS')
            SET student_grades_summary.grade = 'F';
        WHEN(student_grades_summary.aggregate >= 85 AND student_grades_summary.aggregate <= 100 AND student_grades_summary.level = 'SSS') THEN
            SET student_grades_summary.grade = 'A1';
        WHEN(student_grades_summary.aggregate >= 80 AND student_grades_summary.aggregate <= 84 AND student_grades_summary.level = 'SSS') THEN
            SET student_grades_summary.grade = 'B2';
        WHEN(student_grades_summary.aggregate >= 75 AND student_grades_summary.aggregate <= 79 AND student_grades_summary.level = 'SSS') THEN
            SET student_grades_summary.grade = 'B3';
        WHEN(student_grades_summary.aggregate >= 70 AND student_grades_summary.aggregate <= 74 AND student_grades_summary.level = 'SSS') THEN
            SET student_grades_summary.grade = 'C4';
        WHEN(student_grades_summary.aggregate >= 65 AND student_grades_summary.aggregate <= 69 AND student_grades_summary.level = 'SSS') THEN
            SET student_grades_summary.grade = 'C5';
        WHEN(student_grades_summary.aggregate >= 60 AND student_grades_summary.aggregate <= 64 AND student_grades_summary.level = 'SSS') THEN
            SET student_grades_summary.grade = 'C6';
        WHEN(student_grades_summary.aggregate >= 55 AND student_grades_summary.aggregate <= 59 AND student_grades_summary.level = 'SSS') THEN
            SET student_grades_summary.grade = 'D7';
        WHEN(student_grades_summary.aggregate >= 50 AND student_grades_summary.aggregate <= 54 AND student_grades_summary.level = 'SSS') THEN
            SET student_grades_summary.grade = 'E8';
        WHEN(student_grades_summary.aggregate <= 49 AND student_grades_summary.level = 'SSS') THEN
            SET student_grades_summary.grade = 'F9';
END CASE;

這是我試圖將存儲過程包括在內的SQL查詢。基本上,我試圖通過使用存儲過程將值添加到student_grades_summary中的成績列。 無論如何,這里是SQL:

select user_students.fname as FirstName, user_students.lname as LastName
     , student_grades_summary.subject as CoreSubjects
     , student_grades_summary.aggregate as Scoreover100
     , student_grades_summary.subjectrank as Position
     , student_grades_summary.term as Term
     , student_grades_summary.level as Level
     , student_grades_summary.class as Class
     , student_grades_summary.section as Section
     , student_grades_summary.session as Session
FROM student_grades_summary 
JOIN user_students 
   ON student_grades_summary.level = user_students.level 
   AND student_grades_summary.class = user_students.class 
   AND student_grades_summary.section = user_students.section 
JOIN config_grades 
   ON student_grades_summary.level = config_grades.level 
WHERE user_students.level = 'JSS' 
   AND user_students.class = '2' 
   AND student_grades_summary.session = '2015/2016'

因此,在phpmyadmin中,我得到很多紅色的波浪線,表示SQL中存在錯誤。 我試圖看一下代碼,找出錯誤所在,但未能成功。

我一次又一次看到。 您不是在考慮使用SQL。 在SQL中,您需要考慮集合。 不要在子程序中思考,而要在集合中思考。 在這種情況下,您的設置是一個評分標准的列表,我們可以將其表示為表格(我將其稱為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'

一旦有了grade_lookup表,您就可以加入該表,並獲得您的成績-無需調用函數-像這樣:

select user_students.fname as FirstName, user_students.lname as LastName
     , s.subject as CoreSubjects
     , s.aggregate as Scoreover100
     , s.subjectrank as Position
     , s.term as Term
     , s.level as Level
     , s.class as Class
     , s.section as Section
     , s.session as Session

     -- the result of our lookup
     , COALESCE(L.grade ,'lookup fail') as Grade

FROM student_grades_summary S
JOIN user_students 
   ON student_grades_summary.level = user_students.level 
   AND student_grades_summary.class = user_students.class 
   AND student_grades_summary.section = user_students.section 
JOIN config_grades 
   ON student_grades_summary.level = config_grades.level 

-- join to grade lookup
LEFT JOIN GRADE_LOOKUP L ON s.aggregate >= L.aggmin 
                   and s.aggregate <= L.aggmax 
                   and s.level = L.lvl

WHERE user_students.level = 'JSS' 
   AND user_students.class = '2' 
   AND student_grades_summary.session = '2015/2016'

請注意,我只是將其保留在您的select語句中-我不知道您的select語句是否正確-不要考慮將我的示例代碼重復用於驗證其正確性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM