fraction 表数据如下:
idstudent_nocoursefraction1101语文1002102语文903103语文884101数学995102数学676103数学997101英语608102英语699103英语53有时我们需要使每行学号的所有学科成绩显示在同一行, 可以使用CASE WHEN来实现这个效果。
执行结果如下:
student_noCHINESEMATHenglish101100NULLNULL10290NULLNULL10388NULLNULL101NULL99NULL102NULL67NULL103NULL99NULL101NULLNULL60102NULLNULL69103NULLNULL53(用 CASE WHEN 语句分别对代表各个学科的"别名列"进行数据填充, 别名所代表的学科取对应学科所在行的fraction字段列的值, 其余行填充为NULL。)
MAX(CASE WHEN) + GROUP BY SELECT student_no, MAX(CASE WHEN course = '语文' THEN fraction ELSE NULL END) AS CHINESE, MAX(CASE WHEN course = '数学' THEN fraction ELSE NULL END) AS MATH, MAX(CASE WHEN course = '英语' THEN fraction ELSE NULL END) AS english FROM fraction GROUP BY student_no;执行结果如下:
student_noCHINESEMATHenglish1011009960102906769103889953(以student_no进行分组, 并对student_no值相同的行保留fraction值最大的一行。先分组, 后取大,再填充 1 )
SQL语句中GROUP BY的执行顺序优先于SELSECT. ↩︎