MS SQLServer 交叉报表(行列互换)

在MS-SQLServer 2005 中可以使用pivot运算符来来实现行列转换. ,但在之前版本中必须使用 case when then else end 语句

下面以学生成绩表来举例:

id姓名 科目 成绩

1 张三 语文 60
2 张三 数学 65
3 张三 外语 70
4 李四 语文 80
5 李四 数学 90
6 李四 外语 85
7 王五 语文 70
8 王五 数学 71
9 王五 外语 75
10 赵六 语文 64
11 赵六 数学 67
12 赵六 外语 76 

查询后得出:

姓名 语文数学外语

李四 80  90  85
王五 70  71  75
张三 60  65  70
赵六 64  67  76

准备数据:

if exists(select id from sysobjects where xtype=‘U‘ and name=‘studentscore‘)
drop table studentscore--删除与实验冲突的表
go
create table studentscore--创建实验表
(
[id] int identity(1,1),
[name] nvarchar(20) not null,
subject nvarchar(20) not null,
score int not null
)
go
--添加实验数据
insert studentscore values (‘张三‘,‘语文‘,‘60‘);
insert studentscore values (‘张三‘,‘数学‘,‘65‘);
insert studentscore values (‘张三‘,‘外语‘,‘70‘);
insert studentscore values (‘李四‘,‘语文‘,‘80‘);
insert studentscore values (‘李四‘,‘数学‘,‘90‘);
insert studentscore values (‘李四‘,‘外语‘,‘85‘);
insert studentscore values (‘王五‘,‘语文‘,‘70‘);
insert studentscore values (‘王五‘,‘数学‘,‘71‘);
insert studentscore values (‘王五‘,‘外语‘,‘75‘);
insert studentscore values (‘赵六‘,‘语文‘,‘64‘);
insert studentscore values (‘赵六‘,‘数学‘,‘67‘);
insert studentscore values (‘赵六‘,‘外语‘,‘76‘);
go
select [id], [name], subject, score from studentscore
go

1 张三 语文 60
2 张三 数学 65
3 张三 外语 70
4 李四 语文 80
5 李四 数学 90
6 李四 外语 85
7 王五 语文 70
8 王五 数学 71
9 王五 外语 75
10 赵六 语文 64
11 赵六 数学 67
12 赵六 外语 76

先利用case when then else end 语句将行转为列:

select [name],[语文]=sum(case when subject=‘语文‘ then score else null end),
[数学]=sum(case when subject=‘数学‘ then score else null end),
[外语]=sum(case when subject=‘外语‘ then score else null end) 
from studentscore group by [name]

查询结果:

李四 80 90 85
王五 70 71 75
张三 60 65 70
赵六 64 67 76

以上查询作用也很大,对于很多情况,比如产品销售表中按照季度统计、按照月份统计等列头内容固定的情况,这样就行了,但往往大多数情况下列头内容是不固定的,象City,用户随时可能删除、添加一些城市,这种情况就是我们所说的动态交叉表,这个时候需要拼下SQL语句了。

SQLServer中局部变量赋值方法
有两种: 
一种: set @变量名 = 值 
二种: select @变量名 = 值 

第二种可以从某个表中得到数据再赋值给变量 
例: 从用户信息表中查询中cid为 20 的用户姓名将他赋值给变量 name 
declare @name varchar(10) --用户名 
select @name=userName from userInfo where cid = 20 
print ‘cid为20的用户姓名:‘ + @name 

递归的select变量:
递归的select变量是指使用select语句和子查询将一个变量与其自身拼接起来。语法形式如下:select @variable = @variable + table.column from table

declare @sql varchar(max)
set @sql = ‘select [name],‘
select @sql = @sql + ‘sum(case subject when ‘‘‘+subject+‘‘‘ 
then score else null end) as ‘‘‘+subject+‘‘‘,‘
from (select distinct subject from studentscore) as a 
select @sql = left(@sql,len(@sql)-1) + ‘ from studentscore group by [name]‘
exec(@sql)

执行结果:

李四90 85 80
王五 71 75 70
张三 65 70 60
赵六 67 76 64


郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。