原来的语句 select COUNT(id) as cnt,(CAST(a.sid as nvarchar)+'-'+CAST(a.layer as nvarchar)) as SidLayer
from Score a
where a.eid=5
group by [sid],layer order by SidLayer得到结果集cnt SidLayer
708 2-1
295 2-2
513 3-1
72 3-2
472 5-1
166 5-2我想将结果行转列,我尝试的用一下Pivot函数,没成功 SidLay是动态的结果集,且按号排序
from Score a
where a.eid=5
group by [sid],layer order by SidLayer得到结果集cnt SidLayer
708 2-1
295 2-2
513 3-1
72 3-2
472 5-1
166 5-2我想将结果行转列,我尝试的用一下Pivot函数,没成功 SidLay是动态的结果集,且按号排序
解决方案 »
- 您的网络包括单个 Active Directory 域。运行 Windows Server 2008 或 Windows 2000 服务器的域控制器。您对 Wi
- 查询范围有OR时,无法实现翻页排序
- sql 语句 求懒人做法
- 两个表数量相减的问题,请教!
- 再请教这个SQL语句该怎么写
- 同样的脚本在WIN2000下可以运行,到WIN 2003下就报错.请高手看看.
- 有个问题求教一下,sql server级联更新是指被参考表更新以后会联动,还是指参考表更新以后会联动?还是both
- 空间满了,一天的数据都没有入库有几百W条数据,有什么好方法找回这个数据吗?
- 如何设置一个用户或创建一个角色,限定访问指定的表或创建自己的表,其他人创建的表和库不显示??
- How To Alter Column
- 求补充完成余额表SQL语句
- 主表 master 与子表 detail 通过自增列做关联,是优点多呢?还是缺点多些呢?
标题:普通行列转换(version 2.0)
作者:爱新觉罗.毓华(十八年风雨,守得冰山雪莲花开)
时间:2008-03-09
地点:广东深圳
说明:普通行列转换(version 1.0)仅针对sql server 2000提供静态和动态写法,version 2.0增加sql server 2005的有关写法。问题:假设有张学生成绩表(tb)如下:
姓名 课程 分数
张三 语文 74
张三 数学 83
张三 物理 93
李四 语文 74
李四 数学 84
李四 物理 94
想变成(得到如下结果):
姓名 语文 数学 物理
---- ---- ---- ----
李四 74 84 94
张三 74 83 93
-------------------
*/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--SQL SERVER 2000 静态SQL,指课程只有语文、数学、物理这三门课程。(以下同)
select 姓名 as 姓名 ,
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 姓名--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) as a
set @sql = @sql + ' from tb group by 姓名'
exec(@sql) --SQL SERVER 2005 静态SQL。
select * from (select * from tb) a pivot (max(分数) for 课程 in (语文,数学,物理)) b--SQL SERVER 2005 动态SQL。
declare @sql varchar(8000)
select @sql = isnull(@sql + '],[' , '') + 课程 from tb group by 课程
set @sql = '[' + @sql + ']'
exec ('select * from (select * from tb) a pivot (max(分数) for 课程 in (' + @sql + ')) b')---------------------------------
if object_id('[tb]') is not null drop table [tb]
create table [tb]([cnt] int,[SidLayer] varchar(3))
insert [tb]
select 708,'2-1' union all
select 295,'2-2' union all
select 513,'3-1' union all
select 72,'3-2' union all
select 472,'5-1' union all
select 166,'5-2'declare @sql varchar(8000)
select @sql = isnull(@sql + '],[' , '') + [SidLayer] from tb group by [SidLayer]
set @sql = '[' + @sql + ']'
exec ('select * from (select * from tb) a pivot (max([cnt]) for [SidLayer] in (' + @sql + ')) b')
/*
2-1 2-2 3-1 3-2 5-1 5-2
----------- ----------- ----------- ----------- ----------- -----------
708 295 513 72 472 166*/
create table [tb]([cnt] int,[SidLayer] varchar(3))
insert [tb]
select 708,'2-1' union all
select 295,'2-2' union all
select 513,'3-1' union all
select 72,'3-2' union all
select 472,'5-1' union all
select 166,'5-2'declare @a nvarchar(50)
set @a=''
select @a=@a+',['+[SidLayer]+']' from tb
set @a= substring(@a,2,len(@a))
exec('select * from tb a pivot (max(cnt) for SidLayer in ('+@a+')) b')
数据库原本没有字段 sidlayer,
只有sid,layer两个字段,数值也中是固定我上面所列举的几种,还有其它的
查询结果集,我想合并成sidlayer显示,用'-'连接,如果是sidlayer字段,楼上的兄台的搞好当然可以了,等待呵。