一句Sql把纵向表转为横向表,并分别分组求平均和总平均值

效果如图所示:

测试sql语句如下:
复制代码 代码如下:
declare @tab table(Class varchar(20),Student varchar(20),Course varchar(50),Quantity decimal(7,2));
insert into @tab(Class,Student,Course,Quantity) values("A班","张三","语文",60);
insert into @tab(Class,Student,Course,Quantity) values("A班","张三","数学",70);
insert into @tab(Class,Student,Course,Quantity) values("A班","张三","英语",80);
insert into @tab(Class,Student,Course,Quantity) values("A班","李四","语文",30);
insert into @tab(Class,Student,Course,Quantity) values("A班","李四","数学",40);
insert into @tab(Class,Student,Course,Quantity) values("A班","李四","英语",50);

insert into @tab(Class,Student,Course,Quantity) values("B班","王五","语文",65);
insert into @tab(Class,Student,Course,Quantity) values("B班","王五","数学",75);
insert into @tab(Class,Student,Course,Quantity) values("B班","王五","英语",85);
insert into @tab(Class,Student,Course,Quantity) values("B班","赵六","语文",35);
insert into @tab(Class,Student,Course,Quantity) values("B班","赵六","数学",45);
insert into @tab(Class,Student,Course,Quantity) values("B班","赵六","英语",55);

select * from @tab

select
(case when Grouping(Class)=1 then "总平均" when Grouping(Student)=1 then "" else Class end ) as Class
,(case when Grouping(Class)=1 then "" when Grouping(Student)=1 then "平均" else Student end) as Student
,avg(语文) as 语文
,avg(数学) as 数学
,avg(英语) as 英语
,avg(总分) as 总分
from (
select Class,Student
,(select isnull(sum(Quantity),0) from @tab where Class=t.Class and Student=t.Student and Course="语文") as "语文"
,(select isnull(sum(Quantity),0) from @tab where Class=t.Class and Student=t.Student and Course="数学") as "数学"
,(select isnull(sum(Quantity),0) from @tab where Class=t.Class and Student=t.Student and Course="英语") as "英语"
,(select isnull(sum(Quantity),0) from @tab where Class=t.Class and Student=t.Student) as "总分"
from @tab as t
group by Class,Student
) as tempTab
group by Class,Student,语文,数学,英语,总分 with rollup
having Grouping(语文)=1
and Grouping(数学)=1
and Grouping(英语)=1

时间: 2025-01-01 08:21:56

一句Sql把纵向表转为横向表,并分别分组求平均和总平均值的相关文章

关于竖表转横表的问题

问题 关于竖表转横表的问题                                                                                本文作者:dinya内容摘要:在开发过程,经常遇到一些将表的显示方式进行转换的需求,我们习惯性称之为竖表到横表的转换,本文通过一个例子来简要说明常见的两种竖表转横表的问题. 本文适宜读者范围:Oracle初级,中级 系统环境:     OS:windows 2000 Professional (英文版) Orac

sql server-Sql server 多表连接,数据横向汇总问题,新手求大神讲解。

问题描述 Sql server 多表连接,数据横向汇总问题,新手求大神讲解. 表1字段是a,b,c. 表2字段是a,T1,T2,T3,T4,T5,T6,T7....T31,M1,M2,M3,M4,M5,M6,M7....M31, 其中 表2中的字段a关联表1的字段a, 循环表1然后根据关联将对应表1中a字段的2表数据横向聚合(T1...T31),(M1....M31),将聚合出来的(T1....T31)值赋值给1表的B字段,(M1....M31)的值赋值给表1的C字段 解决方案 UPDATE t

一句sql更新两个表并可更新对应的字段值具体实现_Access

ACCESS 例子: 复制代码 代码如下: insert into products (ProNumber,CASNumber,Cnname,Price,Enname,Baozhuang,Pinpai) select ProNumber,CASNumber,Cnname,Price,Enname,Baozhuang,Pinpai from product22 1.用一句sql从一个表里面取出数据导入另外一个表里面.这个对不同程序之间的数据转换很有用处,而且速度快,数据完整: insert int

SQL Server 2005:向系统表说再见

微软的SQL Server 数据库管理员 ,快快想一下!在不使用任何的文档的情况下,编写一个查询,从SQL Server 2000系统表中抽取索引的列表,然后列举每个索引中的字段,并判断这个字段是否按照升序或者降序进行排序.你有两分钟的时间.快!  如果你现在真的停下阅读,开始用必不可少的两分钟时间思考这项不讨好的任务,那么现在你就陷入了一个大麻烦中,这里面涉及了系统索引.系统索引关键字,系统字段,以及一些元数据函数,其中包括类似OBJECT_NAME 和INDEXKEY_PROPERTY这样的

select-这句sql语句什么意思???

问题描述 这句sql语句什么意思??? select count(Id) from a_cgxi where flag='6' 解决方案 select count(Id) from a_cgxi where flag='6' flag是表a_cgxi里的字段,这句sql意思是统计flag这个字段值为6的记录个数 解决方案二: 从 a_cgxi 表中查询 flag=6 的ID个数. -------------------------------------------------------- 晕

MSSQL-应用案例-SQL Server 2016基于内存优化表的列存储索引分析Web Access Log

问题引入 在日常的网站运维工作中,我们需要对网站客户端访问情况做统计.汇总.分析和报表展示,以数据来全面掌控网站运营和访问情况.当不可预知的意外情况发生时,我们可以快速发现问题以及采取相应的措施.比如:当网站受到黑客攻击时的流量陡增,又或者是网站某个资源发生意外抛异常等情况. 在提供Web服务的服务器上,比如IIS.Apache都存在访问日志记录,这篇是文章是以SQL Server 2016基于内存优化表的列存储索引来分析Apache Web Access Log为例,讲解分析网站访问情况,因此

select-请问这句SQL语句是什么意思

问题描述 请问这句SQL语句是什么意思 select t.*, b.item_geohash from tianchi_mobile_recommend_train_user t join tianchi_mobile_recommend_train_item b on b.item_id=t.item_id and b.item_category=t.item_category; select count(1) from t_mj_p_user; 解决方案 这是两个查询语句吧 select c

写一句sql查询一年每月的数据量

问题描述 写一句sql查询一年每月的数据量 有一张表A,里面有一个订单ID,创建时间date,现在要查今年每一个月的订单数,返回的字段就是每一个月,还有每月的订单数量,应怎么写? 解决方案 你什么数据库也不说明.不通数据库的日期格式化是有差异的 比如像oracle就可以下面这样写. SELECT DATE,COUNT(*) from A group by to_date(date,'yyyy-mm') order by date 解决方案二: SQL Server: SELECT MONTH([

求SQL语句,将多个表合成一个表,每个表的结构不一样。要过滤重复的字段和行

问题描述 求SQL语句,将多个表合成一个表,每个表的结构不一样.要过滤重复的字段和行如:tb1(idintprimarykey,namevarchar(10),titlevarchar(10),)tb2(idint,namevarchar(10),titlevarchar(10),addressvarchar(10)foreignkey(id)referencestb1(id))tb3(idint,namevarchar(10),telvarchar(10),addressvarchar(10)