普通行列转换
问题:假设有张学生成绩表(tb)如下:
姓名 课程 分数
张三 语文
张三 数学
张三 物理
李四 语文
李四 数学
李四 物理
想变成(得到如下结果):
姓名 语文 数学 物理
---- ---- ---- ----
李四
张三
-------------------
*/ create table tb(姓名 varchar() , 课程 varchar() , 分数 int)
insert into tb values('张三' , '语文' , )
insert into tb values('张三' , '数学' , )
insert into tb values('张三' , '物理' , )
insert into tb values('李四' , '语文' , )
insert into tb values('李四' , '数学' , )
insert into tb values('李四' , '物理' , )
go --SQL SERVER 静态SQL,指课程只有语文、数学、物理这三门课程。(以下同)
select 姓名 as 姓名 ,
max(case 课程 when '语文' then 分数 else end) 语文,
max(case 课程 when '数学' then 分数 else end) 数学,
max(case 课程 when '物理' then 分数 else end) 物理
from tb
group by 姓名 --SQL SERVER 动态SQL,指课程不止语文、数学、物理这三门课程。(以下同)
declare @sql varchar()
set @sql = 'select 姓名 '
select @sql = @sql + ' , max(case 课程 when ''' + 课程 + ''' then 分数 else 0 end) [' + 课程 + ']'
from (select distinct 课程 from tb) as a
set @sql = @sql + ' from tb group by 姓名'
exec(@sql) --SQL SERVER 静态SQL。
select * from (select * from tb) a pivot (max(分数) for 课程 in (语文,数学,物理)) b --SQL SERVER 动态SQL。
declare @sql varchar()
select @sql = isnull(@sql + ',' , '') + 课程 from tb group by 课程
exec ('select * from (select * from tb) a pivot (max(分数) for 课程 in (' + @sql + ')) b') --------------------------------- /*
问题:在上述结果的基础上加平均分,总分,得到如下结果:
姓名 语文 数学 物理 平均分 总分
---- ---- ---- ---- ------ ----
李四 74 84 94 84.00 252
张三 74 83 93 83.33 250
*/ --SQL SERVER 静态SQL。
select 姓名 姓名,
max(case 课程 when '语文' then 分数 else end) 语文,
max(case 课程 when '数学' then 分数 else end) 数学,
max(case 课程 when '物理' then 分数 else end) 物理,
cast(avg(分数*1.0) as decimal(,)) 平均分,
sum(分数) 总分
from tb
group by 姓名 --SQL SERVER 动态SQL。
declare @sql varchar()
set @sql = 'select 姓名 '
select @sql = @sql + ' , max(case 课程 when ''' + 课程 + ''' then 分数 else 0 end) [' + 课程 + ']'
from (select distinct 课程 from tb) as a
set @sql = @sql + ' , cast(avg(分数*1.0) as decimal(18,2)) 平均分 , sum(分数) 总分 from tb group by 姓名'
exec(@sql) --SQL SERVER 静态SQL。
select m.* , n.平均分 , n.总分 from
(select * from (select * from tb) a pivot (max(分数) for 课程 in (语文,数学,物理)) b) m,
(select 姓名 , cast(avg(分数*1.0) as decimal(,)) 平均分 , sum(分数) 总分 from tb group by 姓名) n
where m.姓名 = n.姓名 --SQL SERVER 动态SQL。
declare @sql varchar()
select @sql = isnull(@sql + ',' , '') + 课程 from tb group by 课程
exec ('select m.* , n.平均分 , n.总分 from
(select * from (select * from tb) a pivot (max(分数) for 课程 in (' + @sql + ')) b) m ,
(select 姓名 , cast(avg(分数*1.0) as decimal(,)) 平均分 , sum(分数) 总分 from tb group by 姓名) n
where m.姓名 = n.姓名') drop table tb ------------------
------------------ /*
问题:如果上述两表互相换一下:即表结构和数据为:
姓名 语文 数学 物理
张三 74  83  93
李四 74  84  94
想变成(得到如下结果):
姓名 课程 分数
---- ---- ----
李四 语文 74
李四 数学 84
李四 物理 94
张三 语文 74
张三 数学 83
张三 物理 93
--------------
*/ create table tb(姓名 varchar() , 语文 int , 数学 int , 物理 int)
insert into tb values('张三',,,)
insert into tb values('李四',,,)
go --SQL SERVER 静态SQL。
select * from
(
select 姓名 , 课程 = '语文' , 分数 = 语文 from tb
union all
select 姓名 , 课程 = '数学' , 分数 = 数学 from tb
union all
select 姓名 , 课程 = '物理' , 分数 = 物理 from tb
) t
order by 姓名 , case 课程 when '语文' then when '数学' then when '物理' then end --SQL SERVER 动态SQL。
--调用系统表动态生态。
declare @sql varchar()
select @sql = isnull(@sql + ' union all ' , '' ) + ' select 姓名 , [课程] = ' + quotename(Name , '''') + ' , [分数] = ' + quotename(Name) + ' from tb'
from syscolumns
where name! = N'姓名' and ID = object_id('tb') --表名tb,不包含列名为姓名的其它列
order by colid asc
exec(@sql + ' order by 姓名 ') --SQL SERVER 动态SQL。
select 姓名 , 课程 , 分数 from tb unpivot (分数 for 课程 in([语文] , [数学] , [物理])) t --SQL SERVER 动态SQL,同SQL SERVER 动态SQL。 --------------------
/*
问题:在上述的结果上加个平均分,总分,得到如下结果:
姓名 课程 分数
---- ------ ------
李四 语文 74.00
李四 数学 84.00
李四 物理 94.00
李四 平均分 84.00
李四 总分 252.00
张三 语文 74.00
张三 数学 83.00
张三 物理 93.00
张三 平均分 83.33
张三 总分 250.00
------------------
*/ select * from
(
select 姓名 as 姓名 , 课程 = '语文' , 分数 = 语文 from tb
union all
select 姓名 as 姓名 , 课程 = '数学' , 分数 = 数学 from tb
union all
select 姓名 as 姓名 , 课程 = '物理' , 分数 = 物理 from tb
union all
select 姓名 as 姓名 , 课程 = '平均分' , 分数 = cast((语文 + 数学 + 物理)*1.0/ as decimal(,)) from tb
union all
select 姓名 as 姓名 , 课程 = '总分' , 分数 = 语文 + 数学 + 物理 from tb
) t
order by 姓名 , case 课程 when '语文' then when '数学' then when '物理' then when '平均分' then when '总分' then end drop table tb

转载来源:https://www.cnblogs.com/luowende2012/archive/2012/07/19/2599436.html

最新文章

  1. Johnson 全源最短路径算法
  2. Jsoup系列学习(1)-发送get或post请求
  3. Hive:Spark中如何实现将rdd结果插入到hive1.3.0表中
  4. php 字符串转数组
  5. OPTIMIZE TABLE 小解
  6. hash算法总结收集
  7. 再谈this
  8. Java科普之基础知识回顾
  9. css3 :nth-child 常用用法
  10. 查询Table name, Column name, 拼接执行sql文本, 游标, 存储过程, 临时表
  11. javascript设计模式——Observer
  12. tar.xz文件怎样解压
  13. linux下zookeeper 配置参数
  14. 如何开发使用自定义文件的OEM应用程序
  15. XML 增、删、改
  16. three.js学习:初学three.js,从立方体开始
  17. Codeforces Round #541 (Div. 2)
  18. TeamWork#3,Week5,Release Notes of the Alpha Version
  19. Java 流(Stream)、文件(File)和IO -- Java ByteArrayOutputStream类
  20. sql2008评估板过期

热门文章

  1. left join 后的条件 位置不同,查询的结果不同
  2. 微信公众号 模板消息 定时推送 java
  3. Python实现猜数字游戏1.0版
  4. Debian9桌面设置
  5. 在阿里云的CentOS环境中安装配置MySQL、JDK、Maven
  6. 产品 vs 服务,见识,耐心
  7. Python /usr/bin/python
  8. Matlab与C混编的介绍
  9. ajax技术基础详解
  10. app后端设计(9)-- 动态通知