Sql 如何根据平均分数进行排名和评分
[ ]Sql 如何根据平均分数进行排名和评分,sql,mariadb,Sql,Mariadb,[ ] 而是使A的上限与A的下限相同,等等。 此外,你的成绩表没有考虑平均分数低于1的学生。在这种情况下,我的查询将为分数返回“?” [SET FOREIGN_KEY_CHECKS=0; -- ---------------------------- -- Table structure for category -- ---------------------------- DROP TABLE IF EXISTS `category`; CREATE TABLE `category` (
而是使A的上限与A的下限相同,等等。 此外,你的成绩表没有考虑平均分数低于1的学生。在这种情况下,我的查询将为分数返回“?”
[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;]
你的问题必须是独立的。Google驱动器链接不合适。我无法发布数据库模型图像。如果您提供您正在获得的输出以及您试图获得的输出,并提供一些示例数据,那将是最好的。谢谢。但我怎样才能用平均分数对学生进行排名呢?示例DK排名1。GK排名2。那么GC和FK的排名都是3,所以下一个学生的排名应该是5。我怎么能做到这一点呢?啊,从你的问题上我不明白。这就是为什么你应该在你的问题中提供一两个你想要达到的目标的例子。你的意思是平均分数相同的学生会有相同的排名吗?还是有相同成绩字母的学生?也许你们应该更新这个问题。我的意思是平均分数相同的学生会有相同的分数,我明白了。我不知道如何只用SQL就可以做到这一点。不过,无论您使用何种编程语言来执行SQL语句和处理结果都非常容易。我建议你更新你的问题,加入样本数据,显示两名学生的平均成绩相同,并显示你想要的结果。然后从我的答案中删除“已接受”复选标记(如果愿意,您可以单击向上箭头),以便其他人知道此问题仍然存在。
[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;]
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 | ??? |
+--------+------+---------+-----------+------+------+----------------+-------+---------+-------+