怎么把
a b
a 1
a 2
a 3
b 1
b 2
b 3
变为这样
a 1 2 3
a 1 2 3
b 1 2 3
a b
a 1
a 2
a 3
b 1
b 2
b 3
变为这样
a 1 2 3
a 1 2 3
b 1 2 3
解决方案 »
- patindex函数 和 like的查询效率
- SQL数据库的安装问题
- (((((((SQL数据库和图片问题))))))))))
- MS SQL 2008那里可以下载,正式版的,不要CTP的
- VC 下通过ADO连接sql server 数据库 出了问题???
- 从表TB001(Fcode,Fdate,Fvalue)查询满足Fcode=”001”的元组中Fdate值最大者的Fvalue的值。请用一个SQL语句表达。
- [求助]又遇到问题:如何让指定用户仅能访问指定数据库?
- SQL语句:有T1和T2两个表,表结构一样,怎样把T1有,而T2没的记录复制到T2表中?以姓名字段为准
- 我用WINDOWSXP想连2000 SERVER 的SQL SERVER数据库,能连吗?怎么连,我用的是VB,最好的能有连结的代码。
- 这个问题为什么没人回答?是太简单拉,还是分不够?火烧眉毛拉
- 大家知道有这样的工具吗?
- 存储过程局部变量长度的问题,定义了Varchar 8k,但是只能得到 500多的长度
普通行列转换
(爱新觉罗.毓华 2007-11-18于海南三亚)假设有张学生成绩表(tb)如下:
Name Subject Result
张三 语文 74
张三 数学 83
张三 物理 93
李四 语文 74
李四 数学 84
李四 物理 94
*/-------------------------------------------------------------------------
/*
想变成
姓名 语文 数学 物理
---------- ----------- ----------- -----------
李四 74 84 94
张三 74 83 93
*/create table tb
(
Name varchar(10) ,
Subject varchar(10) ,
Result int
)insert into tb(Name , Subject , Result) values('张三' , '语文' , 74)
insert into tb(Name , Subject , Result) values('张三' , '数学' , 83)
insert into tb(Name , Subject , Result) values('张三' , '物理' , 93)
insert into tb(Name , Subject , Result) values('李四' , '语文' , 74)
insert into tb(Name , Subject , Result) values('李四' , '数学' , 84)
insert into tb(Name , Subject , Result) values('李四' , '物理' , 94)
go--静态SQL,指subject只有语文、数学、物理这三门课程。
select name 姓名,
max(case subject when '语文' then result else 0 end) 语文,
max(case subject when '数学' then result else 0 end) 数学,
max(case subject when '物理' then result else 0 end) 物理
from tb
group by name
/*
姓名 语文 数学 物理
---------- ----------- ----------- -----------
李四 74 84 94
张三 74 83 93
*/--动态SQL,指subject不止语文、数学、物理这三门课程。
declare @sql varchar(8000)
set @sql = 'select Name as ' + '姓名'
select @sql = @sql + ' , max(case Subject when ''' + Subject + ''' then Result else 0 end) [' + Subject + ']'
from (select distinct Subject from tb) as a
set @sql = @sql + ' from tb group by name'
exec(@sql)
/*
姓名 数学 物理 语文
---------- ----------- ----------- -----------
李四 84 94 74
张三 83 93 74
*/-------------------------------------------------------------------
/*加个平均分,总分
姓名 语文 数学 物理 平均分 总分
---------- ----------- ----------- ----------- -------------------- -----------
李四 74 84 94 84.00 252
张三 74 83 93 83.33 250
*/--静态SQL,指subject只有语文、数学、物理这三门课程。
select name 姓名,
max(case subject when '语文' then result else 0 end) 语文,
max(case subject when '数学' then result else 0 end) 数学,
max(case subject when '物理' then result else 0 end) 物理,
cast(avg(result*1.0) as decimal(18,2)) 平均分,
sum(result) 总分
from tb
group by name
/*
姓名 语文 数学 物理 平均分 总分
---------- ----------- ----------- ----------- -------------------- -----------
李四 74 84 94 84.00 252
张三 74 83 93 83.33 250
*/--动态SQL,指subject不止语文、数学、物理这三门课程。
declare @sql1 varchar(8000)
set @sql1 = 'select Name as ' + '姓名'
select @sql1 = @sql1 + ' , max(case Subject when ''' + Subject + ''' then Result else 0 end) [' + Subject + ']'
from (select distinct Subject from tb) as a
set @sql1 = @sql1 + ' , cast(avg(result*1.0) as decimal(18,2)) 平均分,sum(result) 总分 from tb group by name'
exec(@sql1)
/*
姓名 数学 物理 语文 平均分 总分
---------- ----------- ----------- ----------- -------------------- -----------
李四 84 94 74 84.00 252
张三 83 93 74 83.33 250
*/drop table tb ---------------------------------------------------------
---------------------------------------------------------
/*
如果上述两表互相换一下:即姓名 语文 数学 物理
张三 74 83 93
李四 74 84 94想变成
Name Subject Result
---------- ------- -----------
李四 语文 74
李四 数学 84
李四 物理 94
张三 语文 74
张三 数学 83
张三 物理 93
*/create table tb1
(
姓名 varchar(10) ,
语文 int ,
数学 int ,
物理 int
)insert into tb1(姓名 , 语文 , 数学 , 物理) values('张三',74,83,93)
insert into tb1(姓名 , 语文 , 数学 , 物理) values('李四',74,84,94)select * from
(
select 姓名 as Name , Subject = '语文' , Result = 语文 from tb1
union all
select 姓名 as Name , Subject = '数学' , Result = 数学 from tb1
union all
select 姓名 as Name , Subject = '物理' , Result = 物理 from tb1
) t
order by name , case Subject when '语文' then 1 when '数学' then 2 when '物理' then 3 when '总分' then 4 end--------------------------------------------------------------------
/*加个平均分,总分
Name Subject Result
---------- ------- --------------------
李四 语文 74.00
李四 数学 84.00
李四 物理 94.00
李四 平均分 84.00
李四 总分 252.00
张三 语文 74.00
张三 数学 83.00
张三 物理 93.00
张三 平均分 83.33
张三 总分 250.00
*/select * from
(
select 姓名 as Name , Subject = '语文' , Result = 语文 from tb1
union all
select 姓名 as Name , Subject = '数学' , Result = 数学 from tb1
union all
select 姓名 as Name , Subject = '物理' , Result = 物理 from tb1
union all
select 姓名 as Name , Subject = '平均分' , Result = cast((语文 + 数学 + 物理)*1.0/3 as decimal(18,2)) from tb1
union all
select 姓名 as Name , Subject = '总分' , Result = 语文 + 数学 + 物理 from tb1
) t
order by name , case Subject when '语文' then 1 when '数学' then 2 when '物理' then 3 when '平均分' then 4 when '总分' then 5 enddrop table tb1
insert into @tb select 'a',1
insert into @tb select 'a',2
insert into @tb select 'a',3
insert into @tb select 'b',1
insert into @tb select 'b',2
insert into @tb select 'b',3select col1,
max(case when col2 ='1' then col2 end) as '1',
max(case when col2 ='2' then col2 end) as '2',
max(case when col2 ='3' then col2 end) as '3'
from @tb group by col1
create table tb(a varchar(10),b int)
insert into tb values('a', 1)
insert into tb values('a', 2)
insert into tb values('a', 3)
insert into tb values('b', 1)
insert into tb values('b', 2)
insert into tb values('b', 3)
goselect a,
max(case b when 1 then b else 0 end) b1,
max(case b when 2 then b else 0 end) b2,
max(case b when 3 then b else 0 end) b3
from tb
group by adrop table tb/*
a b1 b2 b3
---------- ----------- ----------- -----------
a 1 2 3
b 1 2 3(所影响的行数为 2 行)
*/
a 1 2 3
b 1 2 3别抢我的小梁,这是我哥们给我的奖励
insert into tb values('a', 1)
insert into tb values('a', 2)
insert into tb values('a', 3)
insert into tb values('b', 1)
insert into tb values('b', 2)
insert into tb values('b', 3)
go--静态SQL,指B的值固定为1,2,3
select a,
max(case b when 1 then b else 0 end) b1,
max(case b when 2 then b else 0 end) b2,
max(case b when 3 then b else 0 end) b3
from tb
group by a
/*
a b1 b2 b3
---------- ----------- ----------- -----------
a 1 2 3
b 1 2 3
(所影响的行数为 2 行)
*/--动态SQL,指B的值不固定
declare @sql varchar(8000)
set @sql = 'select a'
select @sql = @sql + ' , max(case b when ''' + cast(b as varchar) + ''' then b else 0 end) [b' + cast(b as varchar) + ']'
from (select distinct b from tb) as a
set @sql = @sql + ' from tb group by a'
exec(@sql)
/*
a b1 b2 b3
---------- ----------- ----------- -----------
a 1 2 3
b 1 2 3
(所影响的行数为 2 行)
*/drop table tb