读书人

行列转换有关问题,在线结帖!

发布时间: 2012-01-22 22:38:43 作者: rapoo

行列转换问题,在线结帖!!急
我有一张表tableA,结构如下:
类型名称 基本 业绩 提成
电子 500 1000 100
电脑 400 1200 240
合计 900 2200 340

怎么得到以下结果:
--------------------------------
类型名称 电子 电脑 合计
基本 500 400 900
业绩 1000 1200 2200
提成 100 240 340

[解决办法]
Select 类型名称,Sum(电子) As 电子,Sum(电脑) As 电脑,Sum(合计) As 合计
From (
Select
'基本 ' As 类型名称,
Case 类型名称 When '电子 ' Then 基本 Else 0 End As 电子,
Case 类型名称 When '电脑 ' Then 基本 Else 0 End As 电脑,
Case 类型名称 When '合计 ' Then 基本 Else 0 End As 合计
From
TableA
Union All
Select
'业绩 ' As 类型名称,
Case 类型名称 When '电子 ' Then 业绩 Else 0 End As 电子,
Case 类型名称 When '电脑 ' Then 业绩 Else 0 End As 电脑,
Case 类型名称 When '合计 ' Then 业绩 Else 0 End As 合计
From
TableA
Union All
Select
'提成 ' As 类型名称,
Case 类型名称 When '电子 ' Then 提成 Else 0 End As 电子,
Case 类型名称 When '电脑 ' Then 提成 Else 0 End As 电脑,
Case 类型名称 When '合计 ' Then 提成 Else 0 End As 合计
From
TableA
) T Group By 类型名称 Order By 类型名称 Desc
[解决办法]
---创建测试数据
If Object_id( 'TableA ') Is Not Null
Drop Table TableA
Go
Create Table TableA(类型名称 Varchar(10),基本 Int,业绩 Int,提成 Int)
Insert TableA Select '电子 ',500,1000,100
Union All Select '电脑 ',400,1200,240
Union All Select '合计 ',900,2200,340

---查询测试数据
Select * From TableA

---查询结果
Select 类型名称,Sum(电子) As 电子,Sum(电脑) As 电脑,Sum(合计) As 合计
From (
Select
'基本 ' As 类型名称,
Case 类型名称 When '电子 ' Then 基本 Else 0 End As 电子,
Case 类型名称 When '电脑 ' Then 基本 Else 0 End As 电脑,
Case 类型名称 When '合计 ' Then 基本 Else 0 End As 合计
From
TableA
Union All
Select
'业绩 ' As 类型名称,
Case 类型名称 When '电子 ' Then 业绩 Else 0 End As 电子,
Case 类型名称 When '电脑 ' Then 业绩 Else 0 End As 电脑,
Case 类型名称 When '合计 ' Then 业绩 Else 0 End As 合计
From
TableA
Union All
Select
'提成 ' As 类型名称,
Case 类型名称 When '电子 ' Then 提成 Else 0 End As 电子,
Case 类型名称 When '电脑 ' Then 提成 Else 0 End As 电脑,
Case 类型名称 When '合计 ' Then 提成 Else 0 End As 合计
From
TableA
) T Group By 类型名称 Order By 类型名称 Desc
--结果
/*
类型名称 电子 电脑 合计


---- ----------- ----------- -----------
业绩 1000 1200 2200
提成 100 240 340
基本 500 400 900

(所影响的行数为 3 行)
*/
[解决办法]
行列互换问题,给一个例子作为参考:
------------------------------------------------
--生成测试数据
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 @s=@s+ ', '+A+ ' varchar(10) ' from test1
set @s=@s+ ') '
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 '+@name+ ' as t into test3 from test1 ')
set @s= 'insert into test2 select ' ' '+@name+ ' ' ' '
select @s=@s+ ', ' ' '+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 test2

/*
a x y z
---- ---- ---- ----
b 1 5 9
c 2 6 10
d 3 7 11
e 4 8 12
*/


--删除测试数据
drop table test1,test2

读书人网 >SQL Server

热点推荐