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. 实现SQL Server中的切割字符串SplitString函数,返回Table

    有时我们要用到批量操作时都会对字符串进行拆分,可是SQL Server中却没有自带Split函数,所以要自己来实现了. -- ===================================== ...

  2. 微软BI 之SSIS 系列 - 在 SQL 和 SSIS 中实现行转列的 PIVOT 透视操作

    开篇介绍 记得笔者在 2006年左右刚开始学习 SQL Server 2000 的时候,遇到一个面试题就是行转列,列转行的操作,当时写了很长时间的 SQL 语句最终还是以失败而告终.后来即使能写出来, ...

  3. [游戏模版8] Win32 透明贴图

    >_<:The same with previous introduction. In the InitInstance fanction make a little change: &g ...

  4. paip.spring 获取bean getBean 没有beanid的情况下

    paip.spring 获取bean  getBean 没有beanid的情况下 spring能自动扫描带有注解的bean文件.. 作者Attilax  艾龙,  EMAIL:1466519819@q ...

  5. Template Method模式和Strategy模式[继承与委托]

    继承 program by difference. 通过继承,可以建立完整的软件结构分层.其中每一层都可以重用该层次以上的Code. 过度使用继承的代价是巨大的.应使用组合或者委托来替代继承. Tem ...

  6. SqlServer 查看事务锁及执行语句

    一.查看当前锁定的事务 ,) ,用户机器名称,) ,是否被锁住),blocked) ,数据库名称,),cmd 命令,waittype as 等待类型 ,last_batch 最后批处理时间,open_ ...

  7. 关于linux curl 地址参数的问题

    例如 url 为 http://mywebsite.com/index.PHP?a=1&b=2&c=3web形式下访问url地址,使用$_GET是可以获取到所有的参数然而在Linux下 ...

  8. python两个文件的对比

    #encoding=utf-8 class SyncPagemaptoDB(object): def loadOldmap(self,oldpage,newpage,new_version): map ...

  9. c#之第三课

    学习获取终端输入的参数并且打印,以及使用循环. using System; public class CommandLine { public static void Main(string[] ar ...

  10. NR_OPEN 与 NR_FILE 的区别

    NR_OPEN 与 NR_FILE 的区别 阅读0.11版的内核源码时,在linux-0.11/fs/pipe.c中,函数sys_pipe()里面出现了2个宏定义,NR_OPEN 与 NR_FILE. ...