1、普通行列转换

假设有张学生成绩表(tb)如下:

Name Subject Result

张三 语文  74

张三 数学  83

张三 物理  93

李四 语文  74

李四 数学  84

李四 物理  94

*/

-------------------------------------------------------------------------

/*

想变成

姓名         语文        数学        物理

---------- ----------- ----------- -----------

李四         74          84          94

张三         74          83          93

*/

create table tb

(

Name    varchar(10) ,

Subject varchar(10) ,

Result  int

)

insert into tb(Name , Subject , Result) values('张三' , '语文' , 74)

insert into tb(Name , Subject , Result) values('张三' , '数学' , 83)

insert into tb(Name , Subject , Result) values('张三' , '物理' , 93)

insert into tb(Name , Subject , Result) values('李四' , '语文' , 74)

insert into tb(Name , Subject , Result) values('李四' , '数学' , 84)

insert into tb(Name , Subject , Result) values('李四' , '物理' , 94)

go

--静态SQL,指subject只有语文、数学、物理这三门课程。

select name 姓名,

max(case subject when '语文' then result else 0 end) 语文,

max(case subject when '数学' then result else 0 end) 数学,

max(case subject when '物理' then result else 0 end) 物理

from tb

group by name

/*

姓名         语文        数学        物理

---------- ----------- ----------- -----------

李四         74          84          94

张三         74          83          93

*/

--动态SQL,指subject不止语文、数学、物理这三门课程。

declare @sql varchar(8000)

set @sql = 'select Name as ' + '姓名'

select @sql = @sql + ' , max(case Subject when ''' + Subject + ''' then Result else 0 end) [' + Subject + ']'

from (select distinct Subject from tb) as a

set @sql = @sql + ' from tb group by name'

exec(@sql)

/*

姓名         数学        物理        语文

---------- ----------- ----------- -----------

李四         84          94          74

张三         83          93          74

*/

-------------------------------------------------------------------

/*加个平均分,总分

姓名         语文        数学        物理        平均分                总分

---------- ----------- ----------- ----------- -------------------- -----------

李四         74          84          94          84.00                252

张三         74          83          93          83.33                250

*/

--静态SQL,指subject只有语文、数学、物理这三门课程。

select name 姓名,

max(case subject when '语文' then result else 0 end) 语文,

max(case subject when '数学' then result else 0 end) 数学,

max(case subject when '物理' then result else 0 end) 物理,

cast(avg(result*1.0) as decimal(18,2)) 平均分,

sum(result) 总分

from tb

group by name

/*

姓名         语文        数学        物理        平均分                总分

---------- ----------- ----------- ----------- -------------------- -----------

李四         74          84          94          84.00                252

张三         74          83          93          83.33                250

*/

--动态SQL,指subject不止语文、数学、物理这三门课程。

declare @sql1 varchar(8000)

set @sql1 = 'select Name as ' + '姓名'

select @sql1 = @sql1 + ' , max(case Subject when ''' + Subject + ''' then Result else 0 end) [' + Subject + ']'

from (select distinct Subject from tb) as a

set @sql1 = @sql1 + ' , cast(avg(result*1.0) as decimal(18,2)) 平均分,sum(result) 总分 from tb group by name'

exec(@sql1)

/*

姓名         数学        物理        语文        平均分                总分

---------- ----------- ----------- ----------- -------------------- -----------

李四         84          94          74          84.00                252

张三         83          93          74          83.33                250

*/

drop table tb

---------------------------------------------------------

---------------------------------------------------------

/*

如果上述两表互相换一下:即

姓名 语文 数学 物理

张三 74  83  93

李四 74  84  94

想变成

Name       Subject Result

---------- ------- -----------

李四         语文      74

李四         数学      84

李四         物理      94

张三         语文      74

张三         数学      83

张三         物理      93

*/

create table tb1

(

姓名 varchar(10) ,

语文 int ,

数学 int ,

物理 int

)

insert into tb1(姓名 , 语文 , 数学 , 物理) values('张三',74,83,93)

insert into tb1(姓名 , 语文 , 数学 , 物理) values('李四',74,84,94)

select * from

(

select 姓名 as Name , Subject = '语文' , Result = 语文 from tb1

union all

select 姓名 as Name , Subject = '数学' , Result = 数学 from tb1

union all

select 姓名 as Name , Subject = '物理' , Result = 物理 from tb1

) t

order by name , case Subject when '语文' then 1 when '数学' then 2 when '物理' then 3 when '总分' then 4 end

--------------------------------------------------------------------

/*加个平均分,总分

Name       Subject     Result

---------- -------    --------------------

李四         语文      74.00

李四         数学      84.00

李四         物理      94.00

李四         平均分    84.00

李四         总分      252.00

张三         语文      74.00

张三         数学      83.00

张三         物理      93.00

张三         平均分    83.33

张三         总分      250.00

*/

select * from

(

select 姓名 as Name , Subject = '语文' , Result = 语文 from tb1

union all

select 姓名 as Name , Subject = '数学' , Result = 数学 from tb1

union all

select 姓名 as Name , Subject = '物理' , Result = 物理 from tb1

union all

select 姓名 as Name , Subject = '平均分' , Result = cast((语文 + 数学 + 物理)*1.0/3 as decimal(18,2)) from tb1

union all

select 姓名 as Name , Subject = '总分' , Result = 语文 + 数学 + 物理 from tb1

) t

order by name , case Subject when '语文' then 1 when '数学' then 2 when '物理' then 3 when '平均分' then 4 when '总分' then 5 end

drop table tb1

SQL行列转换问题整理相关推荐

  1. SQL行列转换6种方法

    在进行报表开发时,很多时候会遇到行列转换操作,很对开发人员针对于SQL级别行列转换操作一直不甚理解,今天正好抽空对其进行了一些简单的总结.这里主要列举3种可以实现SQL行列转换的方法,包括通用SQL解 ...

  2. 数据透视表sql:用SQL行列转换实现数据透视的一些思考

    用SQL行列转换实现数据透视的一些思考 摘要:根据对报表开发过程中碰到的需要用SQL行列转换进行解决的一类查询统计问题的分析,逐步探索求解得到一种较通用的解决思路,并用函数进行实现.该解决思路及函数实 ...

  3. SQL实战篇:SQL行列转换及真题

    对于数据分析师来说,日常进行SQL分析和制作报表的过程中,经常会遇到通过SQL进行行列转换的需求,本节内容对常见的行列转换进行了总结,常见的行列转换包括以下四种情况: 列转行 行转列 列转换成字符串 ...

  4. sql行列转换 求学过01和02的人

    参考自:(14条消息) SQL:行列转换_lch_2016的博客-CSDN博客_sql行列转换 sql: where 不能使用聚合函数,不能使用同一等级的别名 行转列: 用到的是case 的第一种用法 ...

  5. SQL常用语法网络整理版本

    下列语句部分是Mssql语句实现: SQL分类: DDL-数据定义语言(CREATE,ALTER,DROP,DECLARE) DML-数据操纵语言(SELECT,DELETE,UPDATE,INSER ...

  6. SQL Server中行列转换 Pivot UnPivot (转载)

    SQL Server中行列转换 Pivot UnPivot PIVOT用于将列值旋转为列名(即行转列),在SQL Server 2000可以用聚合函数配合CASE语句实现PIVOT的一般语法是:PIV ...

  7. [转载]SQL Server行列转换实现

    一.Pivot和UnPivot介绍 1.Pivot介绍 PIVOT用于将列值旋转为列名(即行转列),在SQL Server 2000可以用聚合函数配合CASE语句实现 PIVOT的一般语法是:PIVO ...

  8. SQL Server 行列转换(2)

    参考前一个例子http://www.cnblogs.com/insus/articles/1969896.html,现想使用另外一种方式来处理行列转换,实现下面效果: 参考代码: View Code ...

  9. SQL语句行列转换两种方法 case ...when 和pivot函数应用

    2019独角兽企业重金招聘Python工程师标准>>> SQL语句行列转换两种方法 case ...when 和pivot函数应用SQL语句行列转换两种方法 case ...when ...

最新文章

  1. 调用管道模型:高敏感、高性能
  2. 全国计算机等级考试第3套,全国计算机等级考试四级计算机网络第3套试题
  3. 澳大利亚悉尼大学徐畅教授招收深度学习方向全奖博士生
  4. 【 C 】队列 简记
  5. java 两个等长数组的中位数_查询两个数组的中位数
  6. ADO.NET开发总结(学习笔记)
  7. 类加载器、双亲委派模型
  8. jvm内置锁synchronized不能被中断
  9. MySQL索引知识点
  10. SAP CRM Product hierarchy,Category和Application的三个问题
  11. CF1158D. Beautiful Array
  12. Angstrom移植操作
  13. java I O类大全_Java I/O最简单的几个类
  14. 从蚂蚁金服实践入手,带你深入了解 Service Mesh
  15. extern 与 #define 使用说明
  16. 北航教授王田苗:中国机器人的发展机遇与挑战是什么?
  17. ActionBarSherlock学习笔记 第一篇——部署
  18. 如何下载省市县行政区划及乡镇边界
  19. 怎么用计算机打出黑人,电脑上怎么打法文
  20. OpenFOAM 粘弹性流体求解器rheoTool

热门文章

  1. GPU 与CPU的作用协调,工作流程、GPU整合到CPU得好处
  2. Inpainting图像修复halcon算子,持续更新
  3. 与 OpenCV 1 同时使用
  4. ABB机器人 系统参数配置
  5. java将xml中的标签名称转为小写_深入学习Java Web(七): JSTL标签库
  6. ole2高级编程技术 pdf_21天快速掌握Python语言,《21天学通Python》PDF版送给你去学...
  7. 小程序 生成条形码barcode.js
  8. Mapreduce的序列化和流量统计程序开发
  9. css3-6 表格如何设置样式和定位样式是什么
  10. Javasript设计模式之链式调用