能否将列转换为行
时间:2011-11-10
来源:互联网
id qty salevalue ml mll 列名
1 100 1000 10 10%
2 200 2000 20 10%
3 300 3000 30 10%
1 101 1001 10 10%
2 201 2001 20 10%
3 301 3001 30 10%
1 102 1002 10 10%
2 202 2002 20 10%
3 302 3002 30 10%
想要的数据
qty 1 100 101 102
qty 2 200 201 202
qty 3 300 301 302
salevalue 1 1000 1001 1002
salevalue 2 2000 2001 2002
salevalue 3 3000 3001 3002
ml 1 10 10 10
ml 2 20 20 20
ml 3 30 30 30
不知道大家能看的懂吗。。这对我来说太有难度了。
作者: jichengwei001 发布时间: 2011-11-10
作者: jichengwei001 发布时间: 2011-11-10
作者: OrchidCat 发布时间: 2011-11-10
/* 问题:如果上述两表互相换一下:即表结构和数据为: 姓名 语文 数学 物理 张三 74 83 93 李四 74 84 94 想变成(得到如下结果): 姓名 课程 分数 ---- ---- ---- 李四 语文 74 李四 数学 84 李四 物理 94 张三 语文 74 张三 数学 83 张三 物理 93 -------------- */ create table tb(姓名 varchar(10) , 语文 int , 数学 int , 物理 int) insert into tb values('张三',74,83,93) insert into tb values('李四',74,84,94) go --SQL SERVER 2000 静态SQL。 select * from ( select 姓名 , 课程 = '语文' , 分数 = 语文 from tb union all select 姓名 , 课程 = '数学' , 分数 = 数学 from tb union all select 姓名 , 课程 = '物理' , 分数 = 物理 from tb ) t order by 姓名 , case 课程 when '语文' then 1 when '数学' then 2 when '物理' then 3 end --SQL SERVER 2000 动态SQL。 --调用系统表动态生态。 declare @sql varchar(8000) select @sql = isnull(@sql + ' union all ' , '' ) + ' select 姓名 , [课程] = ' + quotename(Name , '''') + ' , [分数] = ' + quotename(Name) + ' from tb' from syscolumns where name! = N'姓名' and ID = object_id('tb') --表名tb,不包含列名为姓名的其它列 order by colid asc exec(@sql + ' order by 姓名 ') --SQL SERVER 2005 动态SQL。 select 姓名 , 课程 , 分数 from tb unpivot (分数 for 课程 in([语文] , [数学] , [物理])) t --SQL SERVER 2005 动态SQL,同SQL SERVER 2000 动态SQL。 --------------------
作者: fredrickhu 发布时间: 2011-11-10
--> --> (Roy)生成測試數據 if not object_id('Tempdb..#T') is null drop table #T Go Create table #T([id] int,[qty] int,[salevalue] int,[ml] int,[mll] nvarchar(3)) Insert #T select 1,100,1000,10,N'10%' union all select 2,200,2000,20,N'10%' union all select 3,300,3000,30,N'10%' union all select 1,101,1001,10,N'10%' union all select 2,201,2001,20,N'10%' union all select 3,301,3001,30,N'10%' union all select 1,102,1002,10,N'10%' union all select 2,202,2002,20,N'10%' union all select 3,302,3002,30,N'10%' Go ;with a as ( Select *,NTILE(3) over( order by (select 1)) as row from #T as a ) select 'Qty' as ColName,a.ID,a.qty as Col1,b.qty as col2,c.qty as col3 from a left join a as b on b.row=a.row+1 and a.id=b.ID left join a as c on c.row=b.row+1 and a.id=c.ID where a.row=1 union all select 'salevalue' as ColName,a.ID,a.[salevalue] as Col1,b.[salevalue] as col2,c.[salevalue] as col3 from a left join a as b on b.row=a.row+1 and a.id=b.ID left join a as c on c.row=b.row+1 and a.id=c.ID where a.row=1 union all select 'ml' as ColName,a.ID,a.[ml] as Col1,b.[ml] as col2,c.[ml] as col3 from a left join a as b on b.row=a.row+1 and a.id=b.ID left join a as c on c.row=b.row+1 and a.id=c.ID where a.row=1 /* ColName ID Col1 col2 col3 Qty 1 100 101 102 Qty 2 200 201 202 Qty 3 300 301 302 salevalue 1 1000 1001 1002 salevalue 2 2000 2001 2002 salevalue 3 3000 3001 3002 ml 1 10 10 10 ml 2 20 20 20 ml 3 30 30 30 */
作者: roy_88 发布时间: 2011-11-10
if not object_id('T') is null drop table T Go Create table T([id] int,[qty] int,[salevalue] int,[ml] int,[mll] nvarchar(3)) Insert T select 1,100,1000,10,N'10%' union all select 2,200,2000,20,N'10%' union all select 3,300,3000,30,N'10%' union all select 1,101,1001,10,N'10%' union all select 2,201,2001,20,N'10%' union all select 3,301,3001,30,N'10%' union all select 1,102,1002,10,N'10%' union all select 2,202,2002,20,N'10%' union all select 3,302,3002,30,N'10%' go declare @s varchar(8000),@i varchar(3),@s2 varchar(8000),@s3 varchar(8000) select top 1 @i=COUNT(*), @s='', @s2='', @s3='' from T group by ID order by count(*) desc while @i>0 select @s=',[Col'+@i+']=max(case when row='+@i+' then [qty] end)'+@s, @s2=',[Col'+@i+']=max(case when row='+@i+' then [qty] end)'+@s2, @s3=',[Col'+@i+']=max(case when row='+@i+' then [qty] end)'+@s3, @i=@i-1 print @s exec('with a as (select *,row=row_number()over(partition by ID order by ID)from T) select ''Qty'' as ColName'+@s+' from a group by ID union all select ''salevalue'' as ColName'+@s2+' from a group by ID union all select ''ml'' as ColName'+@s3+' from a group by ID') /* ColName Col1 Col2 Col3 Qty 100 101 102 Qty 202 201 200 Qty 300 301 302 salevalue 100 101 102 salevalue 202 201 200 salevalue 300 301 302 ml 100 101 102 ml 202 201 200 ml 300 301 302 */
作者: roy_88 发布时间: 2011-11-10
多谢各位
作者: jichengwei001 发布时间: 2011-11-10
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28