锋利的SQL-SQLServer的表旋转(行列转换)(三)

2014-11-24 02:54:41 · 作者: · 浏览: 19
句:

SELECT stu_name, exam_date,

CASEWHEN exam_sub = '语文' THENexam_score

ELSE NULL

ENDAS 语文,

CASEWHEN exam_sub = '数学' THENexam_score

ELSE NULL

ENDAS 数学,

CASEWHEN exam_sub = '英语' THENexam_score

ELSE NULL

ENDAS 英语

FROM exams;

上面语句将得到如表12-24所示的结果。

表12-24 使用CASE表达式得到的结果

stu_name

exam_date

语文

数学

英语

张三

2009-06-20

90

NULL

NULL

张三

2009-06-20

NULL

95

NULL

张三

2009-06-20

NULL

NULL

100

张三

2009-09-20

85

NULL

NULL

张三

2009-09-20

NULL

90

NULL

张三

2009-09-20

NULL

NULL

98

李四

2009-06-20

80

NULL

NULL

李四

2009-06-20

NULL

85

NULL

李四

2009-06-20

NULL

NULL

90

李四

2009-09-20

75

NULL

NULL

李四

2009-09-20

NULL

80

NULL

李四

2009-09-20

NULL

NULL

88

由上表可以看出,只要按stu_name、exam_date分组计算最大值,就可以得到表12-23所要求的计算结果。参考下面的语句:

SELECT stu_name, exam_date,

MAX(CASE WHEN exam_sub = '语文' THEN exam_score

ELSE NULL

END) AS 语文,

MAX(CASE WHEN exam_sub = '数学' THEN exam_score

ELSE NULL

END) AS 数学,

MAX(CASE WHEN exam_sub = '英语' THEN exam_score

ELSE NULL

END) AS 英语

FROM exams

GROUP BY stu_name, exam_date

ORDER BY stu_name, exam_date;