统计显示,行转列的问题

yrs007 2015-09-14 12:21:55
表: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,学号唯一,求这行转列及统计语句,谢谢。。。。。
...全文
61 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
-小蕾- 2015-09-14
  • 打赏
  • 举报
回复
或者:


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


-小蕾- 2015-09-14
  • 打赏
  • 举报
回复


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


-小蕾- 2015-09-14
  • 打赏
  • 举报
回复



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


yrs007 2015-09-14
  • 打赏
  • 举报
回复
表:abc studentID studentName subjectName 分数 2001 张三 数学 90 2001 张三 语文 80 2001 张三 英语 70 2002 李四 数学 80 2002 李四 语文 70 2002 李四 英语 60 2003 刘五 数学 60 2003 刘五 语文 50 2003 刘五 英语 40 查询结果: studentID studentName 数学 语文 英语 总分 平均分 2001 张三 90 80 70 240 80 2002 李四 80 70 60 210 70 2003 刘五 60 50 40 150 50 注:sql 2005,学号唯一,求这行转列及统计语句,谢谢。。。。。
yrs007 2015-09-14
  • 打赏
  • 举报
回复
提示:不支持 PIVOT SQL 构造或语句。
yrs007 2015-09-14
  • 打赏
  • 举报
回复
谢谢,但下面这个我也用过,显示是全部记录的。。不是三条记录... 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

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧