2005 交叉表。行转列
来源:互联网 发布:linux命令vi的使用 编辑:程序博客网 时间:2024/06/10 14:38
2000的就不说了,写2005的。
--1.行转列
If not object_id('[tb]') is null
Drop table [tb]
Go
create table tb(姓名 varchar(10) , 课程 varchar(10) , 分数 int)
Insert tb
Select '张三','语文',60 union all
Select '张三','数学',70 union all
Select '张三','英语',80 union all
Select '张三','物理',90 union all
Select '李四','语文',65 union all
Select '李四','数学',75 union all
Select '李四','英语',85 union all
Select '李四','物理',95
go
--静态查询:
select * from tb pivot(max(分数) for 课程 in(语文,数学,英语,物理)) b
--动态查询:
declare @s varchar(max)
select @s=isnull(@s+',','')+课程 from tb group by 课程
select @s='select * from tb pivot(max(分数) for 课程 in('+@s+'))b'
exec(@s)
/*
姓名 语文 数学 英语 物理
---------- ----------- ----------- ----------- -----------
李四 65 75 85 95
张三 60 70 80 90
(2 行受影响)
*/
--加上总分静态查询
select 姓名,语文,数学,英语,物理,总分
from (select *,总分=sum(分数)over(partition by 姓名) from tb) a
pivot(max(分数) for 课程 in(语文,数学,英语,物理))b
--加上总分动态查询
declare @s varchar(max)
select @s=isnull(@s+',','')+课程 from tb group by 课程
select @s='
select 姓名,'+@s+' from
(select *,总分=sum(分数)over(partition by 姓名) from tb) a
pivot(max(分数) for 课程 in('+@s+'))b'
exec(@s)
/*
姓名 语文 数学 英语 物理 总分
---------- ----------- ----------- ----------- ----------- -----------
张三 60 70 80 90 300
李四 65 75 85 95 320
(2 行受影响)
*/
--2.列转行
If not object_id('tb') is null
Drop table tb
Go
Create table tb(姓名 nvarchar(2),[语文] int,[数学] int,[英语] int,[物理] int)
Insert tb
Select '张三',60,70,80,90 union all
Select '李四',65,75,85,95
Go
--静态查询
select * from tb unpivot(分数 for 课程 in(语文,数学,英语,物理))b
--动态查询
declare @s varchar(max)
select @s=isnull(@s+',','')+name from syscolumns where id=object_id('tb') and name not in('姓名') order by colid
select @s='select * from tb unpivot(分数 for 课程 in('+@s+'))b'
exec(@s)
/*
姓名 分数 课程
------ ---- ------
李四65语文
李四75数学
李四85英语
李四95物理
张三60语文
张三70数学
张三80英语
张三90物理
(8 行受影响)
*/
partition:分组函数
group by 只能得到分组后的统计数据,over partition by 不仅可以得到分组后的统计数据,还可以同时显示明细数据。
group by 是在where子句之后;over partition by 是from子句之前。
- 2005 交叉表。行转列
- 交叉表 行转列 方法
- 交叉表
- 交叉表
- 交叉表
- 交叉表
- 交叉表
- 交叉表
- 交叉表
- SQL Server 2005 处理交叉表
- SQL Server 2005 处理交叉表
- SQL Server 2005 处理交叉表
- SQL Server 2005 处理交叉表
- sql server 2000 2005 交叉表查询
- SQL交叉表实例
- 行列转换 交叉表
- SQL交叉表实例
- SQL交叉表实例
- 类的设计概述
- [转]PHP经典面试题50道
- 微软四月份安全补丁提前通知
- php下通过xml_parse解析xml文件
- 面试中八大经典问题的对应方法
- 2005 交叉表。行转列
- Static in C# .NET
- [ 转]PHP中VC6 X86和VC9 X86的区别及 Non Thread Safe的意思
- 网络编程知识
- weblogic常见问题Q&A
- H.264句法和语法总结(二)NAL层句法
- oracle初始化参数文件管理
- UT斯达康XV6700的写号方法[图]
- [转]PHP分页显示制作详细讲解