通常我们从MySQL表中获取数据并逐行显示已获取的记录。但有时我们需要水平显示记录,如下所示。
Name * Student-ID * subject-1 * subject-2 * subject-3 * subject-4 * subject-5 ... So On
John 1 20 50 34 50 45
Mercy 3 40 20 82 23 10
James 8 30 60 40 50 30
Agi 19 50 10 23 45 30
现在正在寻找能够产生上述结果的方法。下面是MySQL表格,我想提出上述预期结果。
表科目按类分类存储科目
表testinfo存储检查信息如下
表考试将学生分数与相关信息一起存储
得分
查询所有参加考试的学生(1)
SELECT *
FROM examinations AS exam
INNER JOIN examinfo AS info ON info.idsubject = exam.id_subject
WHERE info.assessment_id = 1
以上查询将生成结果垂直,以便如何水平转换或查询表格。我错过了它因为我之前从未以这种方式使用过SQL。谢谢你的手
答案 0 :(得分:1)
您正在寻找MYSQL枢轴
STATIC WAY : 使用条件案例与分组
SELECT CONCAT(exam.fname," ",exam.lname) AS Name, exam.studentid,
SUM(CASE WHEN exam.id_subject = 1 THEN exam.score ELSE "NA" END) AS subject1,
SUM(CASE WHEN exam.id_subject = 2 THEN exam.score ELSE "NA" END) AS subject2,
SUM(CASE WHEN exam.id_subject = 3 THEN exam.score ELSE "NA" END) AS subject3,
SUM(CASE WHEN exam.id_subject = 4 THEN exam.score ELSE "NA" END) AS subject4,
SUM(CASE WHEN exam.id_subject = 5 THEN exam.score ELSE "NA" END) AS subject5
FROM examinations AS exam
INNER JOIN examinfo AS info ON info.idsubject = exam.id_subject
WHERE info.assessment_id = 1
GROUP BY exam.studentid
动态方式:GROUP_CONCAT使用CONCAT
SET @sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT('SUM(CASE WHEN id_subject= "',
id_subject, '" THEN score ELSE "NA" END) AS '
, 'Subject-', id_subject))
INTO @sql
FROM
examinations;
SET @sql = CONCAT('SELECT CONCAT(fname," ",lname) AS Name,
studentid, ', @sql, '
FROM examinations
INNER JOIN examinfo AS info ON info.idsubject = id_subject
WHERE info.assessment_id = 1
GROUP BY studentid');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
答案 1 :(得分:0)
使用以下查询
SELECT CONCAT(exam.fname," ",exam.lname) AS Name, exam.studentid,
(CASE WHEN exam.subjectid = 1 THEN exam.score END ),
(CASE WHEN exam.subjectid = 2 THEN exam.score END ),
(CASE WHEN exam.subjectid = 3 THEN exam.score END ),
(CASE WHEN exam.subjectid = 4 THEN exam.score END ),
(CASE WHEN exam.subjectid = 5 THEN exam.score END ),
FROM examinations AS exam
INNER JOIN examinfo AS info ON info.idsubject = exam.id_subject
WHERE info.assessment_id = 1
GROUP BY exam.studentid