pivot  行转列

unpivot  列转行

源码跑步起来 这是能跑起来的

源码转自 http://www.cnblogs.com/zhangzt/archive/2010/07/29/1787825.html

create table tb(姓名 varchar(10),课程 varchar(10),分数 int)

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

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

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

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

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

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

go

select*from tb

go

select 姓名,

max(case 课程 when'语文' then 分数 else 0 end) 语文,

max(case 课程 when'数学' then 分数 else 0 end) 数学,

max(case 课程 when'物理' then 分数 else 0 end) 物理

from tb

group by 姓名

declare @sql varchar(max)

set @sql='select 姓名'

select @sql=@sql+',max( case 课程 when '''+课程+''' then 分数 else 0 end)['+课程+']'

from(select distinct 课程 from tb)a--同from tb group by课程,默认按课程名排序

set @sql=@sql+' from tb group by 姓名'

exec(@sql)

------
declare @sql varchar(max)

select @sql=isnull(@sql+',','')+' max(case 课程 when '''+课程+''' then 分数 else 0 end) ['+课程+']'

from(select distinct 课程 from tb)asa

set @sql='select 姓名,'+@sql+' from tb group by 姓名'

exec(@sql)
------

select * from tb pivot(max(分数) for 课程 in( 语文,数学,物理))a

---5

declare @sql varchar(8000)

set @sql='' --初始化变量@sql

select @sql=@sql+','+课程 from tb group by 课程--变量多值赋值

set @sql=stuff(@sql,1,1,'')--去掉首个','

set @sql='select * from tb pivot (max(分数) for 课程 in ('+@sql+'))a'

exec(@sql)

--或使用isnull()

declare @sql varchar(8000)

--获得课程集合

select @sql=isnull(@sql+',','')+课程 from tb group by 课程

set @sql='select * from tb pivot (max(分数) for 课程 in ('+@sql+'))a'

exec(@sql)

----
二、行转列结果加上总分、平均分

1、使用SQL Server 2000静态SQL

--SQL SERVER 2000静态SQL

select 姓名,

max(case 课程 when'语文' then 分数 else 0 end)语文,

max(case 课程 when '数学' then 分数 else 0 end)数学,

max(case 课程 when '物理' then 分数 else 0 end)物理,

sum(分数) 总分,

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

from tb

group by 姓名

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

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

李四 74 84 94 252 84.00

张三 74 83 93 250 83.33

2、使用SQL Server 2000动态SQL

--SQL SERVER 2000动态SQL

declare @sql varchar(8000)

set @sql='select 姓名'

select @sql=@sql+',max(case 课程 when '''+课程+''' then 分数 else 0 end)['+课程+']'

from(select distinct 课程 from tb) a

set @sql=@sql+',sum(分数)总分,cast(avg(分数*1.0) as decimal(18,2)) 平均分 from tb group by 姓名'

exec(@sql)

3、使用SQL Server 2005静态SQL

select m.*,n.总分,n.平均分

from

(select* from tb pivot(max(分数) for 课程 in(语文,数学,物理))a)m,

(select 姓名,sum(分数)总分,cast(avg(分数*1.0)as decimal(18,2))平均分

from tb

group by 姓名)n

where m.姓名=n.姓名

4、使用SQL Server 2005动态SQL

--使用stuff()

--

declare @sql varchar(8000)

set @sql='' --初始化变量@sql

select @sql=@sql+','+课程 from tb group by 课程--变量多值赋值

--同select @sql = @sql + ','+课程from (select distinct课程from tb)a

set @sql=stuff(@sql,1,1,'')--去掉首个','

set @sql='select m.* , n.总分,n.平均分 from

(select * from (select * from tb) a pivot (max(分数) for 课程 in ('+@sql+')) b) m ,

(select 姓名,sum(分数)总分, cast(avg(分数*1.0) as decimal(18,2))平均分 from tb group by 姓名) n

where m.姓名= n.姓名'

exec(@sql)

--或使用isnull()

declare @sql varchar(8000)

select @sql=isnull(@sql +',','')+ 课程 from tb group by 课程

set @sql='select m.* , n.总分,n.平均分 from

(select * from (select * from tb) a pivot (max(分数) for 课程 in ('+ @sql+')) b) m ,

(select 姓名,sum(分数)总分, cast(avg(分数*1.0) as decimal(18,2))平均分 from tb group by 姓名) n

where m.姓名= n.姓名'

exec(@sql)

二、列转行

1、建立表格

if object_id('tb')is not null drop table tb

go

create table tb(姓名 varchar(10),语文 int,数学 int,物理 int)

insert into tb values('张三',74,83,93)

insert into tb values('李四',74,84,94)

go

select*from tb

go

姓名 语文 数学 物理

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

张三 74 83 93

李四 74 84 94

2、使用SQL Server 2000静态SQL

--SQL SERVER 2000静态SQL。

select * from
(

select 姓名,课程='语文',分数=语文 from tb

union all

select 姓名,课程='数学',分数=数学 from tb

union all

select 姓名,课程='物理',分数=物理 from tb
)t

order by 姓名,case 课程 when'语文'then 1 when'数学'then 2 when'物理'then 3 end

姓名 课程 分数

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

李四 语文 74

李四 数学 84

李四 物理 94

张三 语文 74

张三 数学 83

张三 物理 93

2、使用SQL Server 2000动态SQL

--SQL SERVER 2000动态SQL。

--调用系统表动态生态。

declare @sql varchar(8000)

select @sql=isnull(@sql+' union all ','')+' select 姓名, [课程]='

+quotename(Name,'''')+' , [分数] = '+quotename(Name)+' from tb'

from syscolumns

where Name!='姓名'and ID=object_id('tb')--表名tb,不包含列名为姓名的其他列

order by colid

exec(@sql+' order by 姓名')

go

3、使用SQL Server 2005静态SQL

--SQL SERVER 2005动态SQL

select 姓名,课程,分数 from tb unpivot (分数 for 课程 in([语文],[数学],[物理])) t

4、使用SQL Server 2005动态SQL

--SQL SERVER 2005动态SQL

declare @sql nvarchar(4000)

select @sql=isnull(@sql+',','')+quotename(Name)

from syscolumns

where ID=object_id('tb')and Name not in('姓名')

order by Colid

set @sql='select 姓名,[课程],[分数] from tb unpivot ([分数] for [课程] in('+@sql+'))b'

exec(@sql)

sql:pivot unpivot的更多相关文章

  1. sql server pivot/unpivot 行列互转

    有时候会碰到行转列的需求(也就是将列的值作为列名称),通常我都是用 CASE END + 聚合函数来实现的. 如下: declare @t table (StudentName nvarchar(20 ...

  2. SQL Server中行列转换 Pivot UnPivot

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

  3. sql server 行转列 Pivot UnPivot

    SQL Server中行列转换 Pivot UnPivot 本文转自:张志涛 原文地址: http://www.cnblogs.com/zhangzt/archive/2010/07/29/17878 ...

  4. SQL Fundamentals: 子查询 || 行列转换(PIVOT,UNPIVOT,DECODE),设置数据层次(LEVEL...CONNECT BY)

    SQL Fundamentals || Oracle SQL语言 子查询(基础) 1.认识子查询 2.WHERE子句中使用子查询 3.在HAVING子句中使用子查询 4.在FROM子句中使用子查询 5 ...

  5. SQL Server中行列转换 Pivot UnPivot

    PIVOT用于将列值旋转为列名(即行转列),在SQLServer 2000可以用聚合函数配合CASE语句实现 PIVOT的一般语法是:PIVOT(聚合函数(列)FOR 列 in (-) )AS P 完 ...

  6. 综合练习: PIVOT、UNPIVOT、GROUPING SETS、GROUPING_ID_1

    综合练习: PIVOT.UNPIVOT.GROUPING SETS.GROUPING_ID 问题1:Desired output: empid cnt2007 cnt2008 cnt2009 ---- ...

  7. [转]Oracle SQL函数pivot、unpivot转置函数实现行转列、列转行

    原文地址:http://blog.csdn.net/seandba/article/details/72730657 函数PIVOT.UNPIVOT转置函数实现行转列.列转行,效果如下图所示: 1.P ...

  8. sql学习~pivot和unpivot用法

    pivot  可以把列值转换为输出中的多个列. pivot 可以在其他剩余的列的值上执行聚合函数. unpivot 将列转换为列值 语法 SELECT <non-pivoted column&g ...

  9. SQL中PIVOT 行列转换

    来源:http://www.studyofnet.com/news/295.html PIVOT通过将表达式某一列中的唯一值转换为输出中的多个列来旋转表值表达式,并在必要时对最终输出中所需的任何其余列 ...

随机推荐

  1. 编译nginx的源码安装subs_filter模块

    使用nginx的反向代理功能搭建nuget镜像服务器时,需要针对官方nuget服务器的响应内容进行字符串替换,比如将www.nuget.org替换为镜像服务器的主机名,将https://替换为http ...

  2. 冲刺阶段 day2

    day2 项目进展 今天本组五位同学聚在一起将项目启动,首先我们对项目进行了规划,分工,明确指出每个人负责哪些项目.由负责第一部分的组员开始编程,在已经搭建好的窗体内,对系部设置进行了编写,本校共六个 ...

  3. Spring AOP(配置文件方式)

    spring配置文件: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="h ...

  4. MySQL笔记汇总

    [目录] MySQL笔记汇总 一.mysql简介 数据简介 结构化查询语言 二.mysql命令行操作 三.数据库(表)更改 表相关 字段相关 索引相关 表引擎操作 四.数据库类型 数字型 字符串型 日 ...

  5. atitit.解决net.sf.json.JSONException There is a cycle in the hierarchy

    atitit.解决net.sf.json.JSONException There is a cycle in the hierarchy 1. 环境:使用hibernate4跟个,,要不个哪的对象系列 ...

  6. atitit.java解析sql语言解析器解释器的实现

    atitit.java解析sql语言解析器解释器的实现 1. 解析sql的本质:实现一个4gl dsl编程语言的编译器 1 2. 解析sql的主要的流程,词法分析,而后进行语法分析,语义分析,构建sq ...

  7. paip 自定义输入法多多输入法词库的备份导出以及导入

    paip 自定义输入法词库的备份导出以及导入 作者Attilax 艾龙,  EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http://blog.csdn.net/ ...

  8. time

    http://blog.csdn.net/JGood/archive/2010/04/07/5457284.aspx    Python提供了多个内置模块用于操作日期时间,像calendar,time ...

  9. Azure Stack如何解决混合云的种种挑战

    微软希望能够通过Azure Stack来帮助企业连接他们的私有云和公共云.但这仍然是一项进行中的工作. 大多数企业都不愿意将所有IT运营都放到公有云中.相反,他们希望可以灵活的在这两个共享的基础架构即 ...

  10. 17数据表&E-R模型&概念数据模型上-选学天轰穿大话数据库视频教程

    大纲:解剖“数据表”,戏说E-R模型,概念数据模型(E-R 到 CDM),使用PowerDesigner创建概念模型,生成逻辑数据模型 土豆超清地址: 腾讯超清地址: 百度云盘下载地址:上传ing,稍 ...