当前位置: 代码迷 >> Sql Server >> 高分求一行列互转查询有关问题
  详细解决方案

高分求一行列互转查询有关问题

热度:39   发布时间:2016-04-27 15:28:31.0
高分求一行列互转查询问题
ID 用户名 朋友A 朋友B 朋友C 朋友D  
1 snhame moon sky gostop fov
2 symbol moov chi she 
3 sn gigi


-------------------------------------------------

 snhame symbol sn
 moon moov gigi
 sky chi
 gostop she 
 fov  

在以前两种查询当种相互转换,希望朋友多多帮忙

------解决方案--------------------
有三例供你参考.

将下表数据:
A b c d e
-------------------- ----------- ----------- ----------- ----------- 
x 1 2 3 4
y 5 6 7 8
z 9 10 11 12

转化成如下结果:
a x y z
-------------------- ---------- ---------- ---------- 
b 1 5 9
c 2 6 10
d 3 7 11
e 4 8 12

--生成测试数据
create table test1(A varchar(20),b int,c int,d int,e int)
insert into test1 select 'x',1,2 ,3 ,4
insert into test1 select 'y',5,6 ,7 ,8
insert into test1 select 'z',9,10,11,12


--生成中间数据表
declare @s varchar(8000)
set @s='create table test2(a varchar(20)'
select @[email protected]+','+A+' varchar(10)' from test1
set @[email protected]+')'
exec(@s)

--借助中间表实现行列转换
declare @name varchar(20)

declare t_cursor cursor for 
select name from syscolumns 
where id=object_id('test1') and colid>1 order by colid

open t_cursor

fetch next from t_cursor into @name

while @@fetch_status=0
begin
exec('select [email protected]+' as t into test3 from test1')
set @s='insert into test2 select [email protected]+''''
select @[email protected]+','''+rtrim(t)+'''' from test3
exec(@s)
exec('drop table test3')
fetch next from t_cursor into @name
end
close t_cursor
deallocate t_cursor


--查看行列互换处理结果
select * from test1
select * from test2

--删除表
drop table test1
drop table test2

----------------------------------------
表1:项目种类 业绩 提成
洗吹类  200 10
外卖 100 5
合计 300 15
转换成:
项目种类 洗吹类 外卖 合计
业绩 200 100 300
提成 10 5 15

if object_id('pubs..tb') is not null
drop table tb
go

create table tb(
项目种类 varchar(10),
业绩 int,
提成 int
)

insert into tb(项目种类,业绩,提成) values('洗吹类',200,10)
insert into tb(项目种类,业绩,提成) values('外卖' ,100,5)
insert into tb(项目种类,业绩,提成) values('合计' ,300,15)
go

select 项目种类,sum(洗吹类) as 洗吹类 , sum(外卖) as 外卖 , sum(合计) as 合计 from
(
select 项目种类 = '业绩',
 洗吹类 = case when 项目种类 = '洗吹类' then 业绩 else 0 end,
 外卖 = case when 项目种类 = '外卖' then 业绩 else 0 end,
 合计 = case when 项目种类 = '合计' then 业绩 else 0 end
from tb
union all
select 项目种类 = '提成' ,
 洗吹类 = case when 项目种类 = '洗吹类' then 提成 else 0 end,
 外卖 = case when 项目种类 = '外卖' then 提成 else 0 end,
 合计 = case when 项目种类 = '合计' then 提成 else 0 end
from tb
) m
group by 项目种类
order by 项目种类 desc

drop table tb

项目种类 洗吹类 外卖 合计
---- ----------- ----------- ----------- 
业绩 200 100 300
提成 10 5 15

(所影响的行数为 2 行)




数据库中有张表格如下
 
工资 福利 奖金
1月 100 200 300
2月 110 210 310
3月 120 220 320
4月 130 230 330

我想得到的结果是

1月 2月 3月 4月
  相关解决方案