表:abc
studentID studentName subjectName 分数
2001 张三 数学 90
2001 张三 语文 80
2001 张三 英语 70
2002 李四 数学 80
2002 李四 语文 70
2002 李四 英语 60
2002 刘五 数学 60
2002 刘五 语文 50
2002 刘五 英语 40
查询结果:
studentID studentName 数学 语文 英语 总分 平均分
2001 张三 90 80 70 240 80
2002 李四 80 70 60 210 70
2003 刘五 60 50 40 150 50
注:sql 2005,学号唯一,求这行转列及统计语句,谢谢。。。。。
------解决思路----------------------
WITH abc(studentID,studentName,subjectName,分数) AS (
SELECT '2001','张三','数学',90 UNION ALL
SELECT '2001','张三','语文',80 UNION ALL
SELECT '2001','张三','英语',70 UNION ALL
SELECT '2002','李四','数学',80 UNION ALL
SELECT '2002','李四','语文',70 UNION ALL
SELECT '2002','李四','英语',60 UNION ALL
SELECT '2003','刘五','数学',60 UNION ALL
SELECT '2003','刘五','语文',50 UNION ALL
SELECT '2003','刘五','英语',40
)
select studentName,
max(case subjectName when '语文' then 分数 else 0 end)语文,
max(case subjectName when '数学' then 分数 else 0 end)数学,
max(case subjectName when '物理' then 分数 else 0 end)物理,
sum(分数)总分,
cast(avg(分数*1.0) as decimal(18,2))平均分
from abc
group by studentName
------解决思路----------------------
select studentID,studentName,
max(case subjectName when '语文' then 分数 else 0 end)语文,
max(case subjectName when '数学' then 分数 else 0 end)数学,
max(case subjectName when '英语' then 分数 else 0 end)英语,
sum(分数)总分,
cast(avg(分数*1.0) as decimal(18,2))平均分
from abc
group by studentID,studentName order by studentID
------解决思路----------------------
或者:
SELECT m.* ,n.总分 ,n.平均分 FROM
( SELECT * FROM abc PIVOT( MAX(分数) FOR subjectName IN (语文,数学,英语)) a) m ,
( SELECT studentID,SUM(分数) 总分,CAST(AVG(分数 * 1.0) AS DECIMAL(18, 2)) 平均分 FROM abc GROUP BY studentID) n
WHERE m.studentID = n.studentID order by studentID