在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)
执行结果:
李四908580 王五7175?70 张三6570?60 赵六6776?64
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|