PIVOT用于将列值旋转为列名(即行转列)

语法:

table_source

PIVOT(

聚合函数(value_column)

FOR pivot_column

IN()

)

UNPIVOT用于将列明转为列值(即列转行)

语法:

table_source

UNPIVOT(

value_column

FOR pivot_column

IN()

)

注意:PIVOT、UNPIVOT是SQL Server 2005的语法,使用需修改数据库兼容级别

在数据库属性->选项->兼容级别改为

90

一、行转列

1、建立表格

ifobject_id('tb')isnotnulldroptabletb

go

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

2、使用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)物理

From tb

Group by姓名

3、使用SQL Server 2000动态SQL

declare@sqlvarchar(500)

set@sql='select姓名'

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

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

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

exec(@sql)

--使用isnull(),变量先确定动态部分

declare@sqlvarchar(8000)

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

from(selectdistinct课程fromtb)asa

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

exec(@sql)

4、使用SQL Server 2005静态SQL

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

5、使用SQL Server 2005动态SQL

--使用stuff()

declare@sqlvarchar(8000)

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

select@sql=@sql+','+课程fromtbgroupby课程--变量多值赋值

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

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

exec(@sql)

--或使用isnull()

declare@sqlvarchar(8000)

–-获得课程集合

select@sql=isnull(@sql+',','')+课程fromtbgroupby课程

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

exec(@sql)

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

1、使用SQL Server 2000静态SQL

select姓名,

max(case课程when'语文'then分数else0end)语文,

max(case课程when'数学'then分数else0end)数学,

max(case课程when'物理'then分数else0end)物理,

sum(分数)总分,

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

fromtb

groupby姓名

2、使用SQL Server 2000动态SQL

--SQL SERVER 2000动态SQL

declare@sqlvarchar(500)

set@sql='select姓名'

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

from(selectdistinct课程fromtb)a

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

exec(@sql)

3、使用SQL Server 2005静态SQL

selectm.*,n.总分,n.平均分

from

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

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

fromtb

groupby姓名)n

wherem.姓名=n.姓名

4、使用SQL Server 2005动态SQL

declare@sqlvarchar(8000)

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

select@sql=@sql+','+课程fromtbgroupby课程--变量多值赋值

--同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@sqlvarchar(8000)

select@sql=isnull(@sql+',','')+课程fromtbgroupby课程

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、建立表格

ifobject_id('tb')isnotnulldroptabletb

go

createtabletb(姓名varchar(10),语文int,数学int,物理int)

insertintotbvalues('张三',74,83,93)

insertintotbvalues('李四',74,84,94)

go

select*fromtb

2、使用SQL Server 2000静态SQL

--SQL SERVER 2000静态SQL。

select*from

(

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

unionall

select姓名,课程='数学',分数=数学fromtb

unionall

select姓名,课程='物理',分数=物理fromtb

) t

orderby姓名,case课程when'语文'then1when'数学'then2when'物理'then3end

2、使用SQL Server 2000动态SQL

--SQL SERVER 2000动态SQL。

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

declare@sqlvarchar(8000)

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

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

fromsyscolumns

whereName!='姓名'andID=object_id('tb')--表名tb,不包含列名为姓名的其他列

orderbycolid

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

3、使用SQL Server 2005静态SQL

--SQL SERVER 2005动态SQL

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

4、使用SQL Server 2005动态SQL

--SQL SERVER 2005动态SQL

declare@sqlnvarchar(4000)

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

fromsyscolumns

whereID=object_id('tb')andNamenotin('姓名')

orderbyColid

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

exec(@sql)

pivot sqlserver 条件_SqlServer行转列(PIVOT),列转行(UNPIVOT)总结相关推荐

  1. pivot sqlserver 条件_SqlServer PIVOT函数快速实现行转列,UNPIVOT实现列转行

    PIVOT函数,行转列 PIVOT函数的格式如下 PIVOT(([聚合列值]) FOR [行转列前的列名] IN([行转列后的列名1],[行转列后的列名2],[行转列后的列名3],.......[行转 ...

  2. pivot sqlserver 条件_行转列之SQLSERVERPIVOT与用法详解

    在数据库操作中,有些时候我们遇到需要实现"行转列"的需求,例如一下的表为某店铺的一周收入情况表: WEEK_INCOME(WEEK VARCHAR(10),INCOME DECIM ...

  3. isnull pivot server sql_多行转换成多列 pivot解决方案

    SQL code/* 标题:普通行列转换(version 2.0) 作者:爱新觉罗.毓华(十八年风雨,守得冰山雪莲花开) 时间:2008-03-09 地点:广东深圳 说明:普通行列转换(version ...

  4. Sqlserver行转列pivot()

    PIVOT概述: PIVOT用于将列值旋转为列名(即行转列),并在必要时对最终输出中所需的任何其余列值执行聚合. PIVOT的一般语法: SELECT [新表字段1,2,3-] FROM [原表名] ...

  5. oracle unpivot 索引_Oracle 行转列pivot 、列转行unpivot 的Sql语句总结

    这个比较简单,用||或concat函数可以实现 select concat(id,username) str from app_user select id||username str from ap ...

  6. sql的行转列(PIVOT)与列转行(UNPIVOT)

    在做数据统计的时候,行转列,列转行是经常碰到的问题.case when方式太麻烦了,而且可扩展性不强,可以使用 PIVOT,UNPIVOT比较快速实现行转列,列转行,而且可扩展性强 一.行转列 1.测 ...

  7. Oracle之行转列pivot函数

    文章目录 方法一: Oracle行转列pivot函数 方法二:使用MAX DECODE 实现 方法一: Oracle行转列pivot函数 语法:pivot(任一聚合函数 for 需要转列的值所在列名 ...

  8. mysql unpivot_SQL行转列(PIVOT)与列转行(UNPIVOT)简明方法

    在做数据统计的时候,行转列,列转行是经常碰到的问题.case when方式太麻烦了,而且可扩展性不强,可以使用 PIVOT,UNPIVOT比较快速实现行转列,列转行,而且可扩展性强 一.行转列 1.测 ...

  9. mysql 列转行 unpivot_sql的行转列(PIVOT)与列转行(UNPIVOT)

    一.行转列 1.测试数据准备 CREATE TABLE [StudentScores] ( [UserName] NVARCHAR(20), --学生姓名 [Subject] NVARCHAR(30) ...

  10. mssql sqlserver 不固定行转列数据(动态列)

    mssql sqlserver 不固定行转列数据(动态列) 原文:mssql sqlserver 不固定行转列数据(动态列) 转自:http://www.maomao365.com/?p=5471 摘 ...

最新文章

  1. php where循环,PHP-foreach循环,例如WHERE子句
  2. Paddle网络结构中的层和模型
  3. 【最贴心】C++字符串转换(stoi;stol;stoul;stoll;stoull;stof;stod;stold)
  4. java可视化压缩_web可视化技术发展(1/6)
  5. 信息学奥赛C++语言:格莱尔的香蕉
  6. uniCloud免费云存储图床源码
  7. 好的物联网开源框架_通过开源文化实现更好的物联网
  8. arcgis desktop 地理编码服务发布
  9. 《你必须知道的.NET》抽奖温暖启动
  10. obj 格式3D模型转 gltf 格式
  11. 独立游戏如何对接STEAM SDK
  12. layabox位移和旋转动画
  13. 移动硬盘插入提示需要格式化RAW_移动硬盘数据恢复
  14. 九型人格Enneagram
  15. WiFi模块吞吐量测试
  16. 六大任务赏金平台,带你深度参与区块链的发展
  17. sqlmanager mysql5_SQL Manager for MySQL
  18. linux 运行脚本时报错:语法错误: 未预期的文件结尾
  19. DML语句,ORACLE数据库
  20. python3 中解决\u8bf7\u6c42\u6210\u529f“格式编码问题

热门文章

  1. 各种波形文件(wlf/vcd/fsdb/shm/vpd)的区别及生成方法(转)
  2. Service Started!!!-end In Service while
  3. treeview实例
  4. usaconbsp;chapternbsp;2.1nbsp;castle
  5. Google Test Primer(四)——简单测试
  6. Dubbo集群容错策略源码分析
  7. Spring Cloud Sleuth链路跟踪之使用Mysq保存服务链路跟踪信息(学习总结)
  8. Spring Cloud Eureka服务注册中心 单节点搭建(学习总结)
  9. 获取客户端用户真实 IP 地址
  10. 一种简便的安装使用 qemu 的方法