自己分析的交叉报表


原始表数据:
t_stu:
SID SUBJECT SCORE
1 数学 99
1 英语 68
1 法律 79
2 数学 92
2 英语 72
2 法律 96
t_s
SID SNAME
1 张三
2 李四



--首先产生3个计算列,数学,英语,法律
SELECT * FROM t_s;
SELECT sid,
(CASE subject WHEN '数学' THEN score END)AS math,
(CASE subject WHEN '英语' THEN score END)AS english,
(CASE subject WHEN '法律' THEN score END)AS law
 FROM t_stu;

SELECT * FROM t_stu;
--列出每个学生的各科成绩
--个人理解这里MIN,因为这里每个学生的科目只有一科,计算不影响查询的单科的成绩,配合分组函数
--这里用sum,max,min来计算都行
SELECT * FROM t_s;
SELECT sid,
MIN(CASE subject WHEN '数学' THEN score END)AS math,
MIN(CASE subject WHEN '英语' THEN score END)AS english,
MIN(CASE subject WHEN '法律' THEN score END)AS law
FROM t_stu
GROUP BY sid;
--加上每个学生总成绩的计算列,计算每个学生的科目总成绩
SELECT sid,
SUM(CASE subject WHEN '数学' THEN score END)AS math,
SUM(CASE subject WHEN '英语' THEN score END)AS english,
SUM(CASE subject WHEN '法律' THEN score END)AS law,
SUM (score) AS 总分数
FROM t_stu
GROUP BY sid;

--查询每个的姓名,各科成绩以及每个学生的总成绩,(加入t_s 中SNAME字段)
SELECT s1.sid,s2.sname,
MIN(CASE subject WHEN '数学' THEN score END)AS math,
MIN(CASE subject WHEN '英语' THEN score END)AS english,
MIN(CASE subject WHEN '法律' THEN score END)AS law,
SUM(score)AS 总分数
FROM t_stu s1
JOIN t_s s2 
ON s1.sid=s2.sid 
GROUP BY s1.sid,s2.sname;
--查询每个的姓名,各科成绩以及每个学生的总成绩以及科目总成绩
SELECT s1.sid,s2.sname,
MIN(CASE subject WHEN '数学' THEN score END)AS math,
MIN(CASE subject WHEN '英语' THEN score END)AS english,
MIN(CASE subject WHEN '法律' THEN score END)AS law,
SUM(score)AS 总分数
FROM t_stu s1
JOIN t_s s2
ON s1.sid=s2.sid
GROUP BY s1.sid,s2.sname
--union后面的表数据就不能顺便用min,或者MAX来代替,以为是计算每个科目总成绩(纵向计算)
UNION ALL
SELECT NULL,NULL,
SUM(CASE subject WHEN '数学' THEN score END)AS math,
SUM(CASE subject WHEN '英语' THEN score END)AS english,
SUM(CASE subject WHEN '法律' THEN score END)AS law,
SUM(score)AS 总分数
FROM t_stu s1
JOIN t_s s2
ON s1.sid=s2.sid;
------
------

你可能感兴趣的:(sql)