2017-11-11 2 views
-2
에 기초 할 수

[어떻게 순위 및 등급 평균 점수

SELECT r.AdNo, 
     r.Name, 
     SUM(CASE WHEN p.SubjectID = 101 THEN s.score ELSE 0 END) AS ENGLISH, 
     SUM(CASE WHEN p.SubjectID = 102 THEN s.score ELSE 0 END) AS KISWAHILI, 
     SUM(CASE WHEN p.SubjectID = 103 THEN s.score ELSE 0 END) AS MATH, 
     SUM(CASE WHEN p.SubjectID = 104 THEN s.score ELSE 0 END) AS CRE, 
     SUM(CASE WHEN p.SubjectID = 105 THEN s.score ELSE 0 END) AS 'SOCIAL STUDIES', 
     SUM(CASE WHEN p.SubjectID THEN s.score ELSE 0 END) AS 'TOTAL', 
     (sum(s.score)/count(s.SubjectID)) AS 'AVERAGE', 
     g.grade_letter 
    FROM student r 
     INNER JOIN marks s ON r.AdNo = s.AdNo 
     INNER JOIN subject p ON s.SubjectID = p.SubjectID 
     INNER JOIN grades g ON 77.2 BETWEEN g.lowerlimit AND g.upperlimit 
    GROUP BY r.Name 
    order by AVERAGE DESC; 

]

[SET FOREIGN_KEY_CHECKS=0; 

-- ---------------------------- 
-- Table structure for category 
-- ---------------------------- 
DROP TABLE IF EXISTS `category`; 
CREATE TABLE `category` (
    `id` bigint(20) NOT NULL AUTO_INCREMENT, 
    `CategoryID` int(4) NOT NULL, 
    `CategoryName` varchar(20) NOT NULL, 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `CategoryID` (`CategoryID`) 
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin1; 

-- ---------------------------- 
-- Table structure for grades 
-- ---------------------------- 
DROP TABLE IF EXISTS `grades`; 
CREATE TABLE `grades` (
    `id` bigint(20) NOT NULL AUTO_INCREMENT, 
    `grade_letter` char(2) DEFAULT NULL, 
    `lowerlimit` double DEFAULT NULL, 
    `upperlimit` double DEFAULT NULL, 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `grade_letter` (`grade_letter`) 
) ENGINE=InnoDB AUTO_INCREMENT=28 DEFAULT CHARSET=latin1; 

-- ---------------------------- 
-- Table structure for marks 
-- ---------------------------- 
DROP TABLE IF EXISTS `marks`; 
CREATE TABLE `marks` (
    `id` bigint(20) NOT NULL AUTO_INCREMENT, 
    `AdNo` varchar(10) DEFAULT NULL, 
    `SubjectID` int(3) DEFAULT NULL, 
    `score` double DEFAULT NULL, 
    `CategoryID` int(11) NOT NULL, 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `AdNo` (`AdNo`,`SubjectID`,`CategoryID`), 
    KEY `SubjectID` (`SubjectID`), 
    KEY `CategoryID` (`CategoryID`), 
    CONSTRAINT `marks_ibfk_1` FOREIGN KEY (`AdNo`) REFERENCES `student` (`AdNo`), 
    CONSTRAINT `marks_ibfk_2` FOREIGN KEY (`SubjectID`) REFERENCES `subject` (`SubjectID`), 
    CONSTRAINT `marks_ibfk_3` FOREIGN KEY (`CategoryID`) REFERENCES `category` (`CategoryID`) 
) ENGINE=InnoDB AUTO_INCREMENT=26 DEFAULT CHARSET=latin1; 

-- ---------------------------- 
-- Table structure for student 
-- ---------------------------- 
DROP TABLE IF EXISTS `student`; 
CREATE TABLE `student` (
    `id` bigint(20) NOT NULL AUTO_INCREMENT, 
    `Name` varchar(30) DEFAULT NULL, 
    `AdNo` varchar(10) DEFAULT NULL, 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `AdNo` (`AdNo`) 
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin1; 

-- ---------------------------- 
-- Table structure for subject 
-- ---------------------------- 
DROP TABLE IF EXISTS `subject`; 
CREATE TABLE `subject` (
    `id` bigint(20) NOT NULL AUTO_INCREMENT, 
    `SubjectID` int(3) DEFAULT NULL, 
    `SubjectName` varchar(20) DEFAULT NULL, 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `SubjectID` (`SubjectID`) 
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=latin1;] 
+0

귀하의 질문은 자체에 포함 할 필요가있다. Google 드라이브 링크가 적합하지 않습니다. –

+0

데이터베이스 모델 이미지를 게시 할 수 없습니다 .. – Multithreadke

+0

이미지를 게시하도록 말하지 않았습니다. 데이터베이스 스키마를 텍스트로 추가하십시오. –

답변

0

오히려 등 (A)의 하한 A-의 상한은 동일한 또한 을 성적표는 평균 점수가 1 미만인 학생은 고려하지 않습니다.이 경우 내 검색어는 "???" 학년을 위해서. 모든 주제에 대한 0마르크와 다른 학생을 추가

SELECT m.*, COALESCE(grades.grade_letter, '???') AS GRADE 
FROM (
    SELECT student.AdNo, student.Name, 
      SUM(IF(subject.SubjectID = 101, marks.score, 0)) AS ENGLISH, 
      SUM(IF(subject.SubjectID = 102, marks.score, 0)) AS KISWAHILI, 
      SUM(IF(subject.SubjectID = 103, marks.score, 0)) AS MATH, 
      SUM(IF(subject.SubjectID = 104, marks.score, 0)) AS CRE, 
      SUM(IF(subject.SubjectID = 105, marks.score, 0)) AS "SOCIAL STUDIES", 
      SUM(IF(subject.SubjectID IS NOT NULL, marks.score, 0)) AS TOTAL, 
      SUM(marks.score)/COUNT(*) AS AVERAGE 
    FROM student 
    INNER JOIN marks ON student.AdNo = marks.AdNo 
    INNER JOIN subject ON marks.SubjectID = subject.SubjectID 
    GROUP BY student.AdNo 
) AS m 
LEFT OUTER JOIN grades 
    ON m.AVERAGE >= grades.lowerlimit 
    AND m.AVERAGE < grades.upperlimit 
ORDER BY m.AVERAGE DESC; 

이 제공 :

+--------+------+---------+-----------+------+------+----------------+-------+---------+-------+ 
| AdNo | Name | ENGLISH | KISWAHILI | MATH | CRE | SOCIAL STUDIES | TOTAL | AVERAGE | GRADE | 
+--------+------+---------+-----------+------+------+----------------+-------+---------+-------+ 
| TU-003 | D K |  67 |  80 | 90 | 70 |    79 | 386 | 77.2 | A- | 
| TU-004 | G K |  57 |  76 | 61 | 78 |    80 | 352 | 70.4 | B+ | 
| TU-001 | G C |  67 |  68 | 78 | 54 |    76 | 343 | 68.6 | B+ | 
| TU-002 | F K |  60 |  34 | 74 | 50 |    67 | 285 |  57 | B- | 
| TU-005 | X X |  0 |   0 | 0 | 0 |    0 |  0 |  0 | ??? | 
+--------+------+---------+-----------+------+------+----------------+-------+---------+-------+ 
+0

고맙습니다. 그러나 평균 점수를 사용하여 학생의 순위를 매기려면 어떻게해야합니까? 예 DK 등급 1. GK 등급 2. GC와 FK 순위 모두 3 : 다음 학생의 순위 : 5. 어떻게해야합니까? – Multithreadke

+0

아, 나는 그 질문을 이해하지 못했습니다. 그렇기 때문에 질문에서 성취하고자하는 것을 한 두 가지 예를 제시해야합니다. 동일한 평균 점수를 가진 학생들의 순위가 동일하다는 것을 의미합니까? 또는 같은 학년 편지를 가진 학생? 아마도 질문을 업데이트해야합니다. – Wodin

+0

동일한 평균 점수를 가진 학생이 같은 순위를 가짐을 의미했습니다. – Multithreadke

관련 문제