मैं एक संग्रहीत प्रक्रिया बनाने की कोशिश कर रहा हूं और मैंलगता है यह गलत हो रहा है। मुझे केवल एसक्यूएल का उपयोग करना है जब मुझे ज़रूरत होती है, इसलिए कृपया एक देव को क्षमा करें और मदद करें। मैं संग्रहीत कार्यविधि में एक 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 में, मुझे यह कहते हुए बहुत सारी लाल स्क्वीजीली लाइनें मिलती हैं कि एसक्यूएल में कोई त्रुटि है। मैंने कोड को देखने और यह खोजने की कोशिश की है कि त्रुटि क्या है, लेकिन "करने में सक्षम नहीं है।
उत्तर:
जवाब के लिए 0 № 1मैं इस समय और समय को फिर से देखता हूं। आप SQL में नहीं सोच रहे हैं। SQL में आपको सेट्स में सोचना होगा। डॉन "सोचें कि उप-रूटीन सेटों में सोचते हैं। इस मामले में आपका सेट एक ग्रेड के मानदंड की एक सूची है, जिसे हम एक तालिका के रूप में प्रस्तुत कर सकते हैं (मैं इसे ग्रेड_एजअप कहूँगा)
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"
एक बार आपके पास ग्रेड_एजअप टेबल हो जाए तो आप उसमें शामिल हो जाते हैं और आपको अपना ग्रेड मिल जाता है - कोई फ़ंक्शन कॉल की आवश्यकता नहीं है - इस तरह:
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"
ध्यान दें, मैंने इसे आपके चुनिंदा बयान में अटका दिया है - मुझे नहीं पता कि आपका चयन कथन सही है या नहीं - मेरे "" उदाहरण के कोड को पुन: उपयोग करने के बारे में विचार नहीं करना चाहिए।