+ -
当前位置:首页 → 问答吧 → 请教SQL 行列 转换问题

请教SQL 行列 转换问题

时间:2011-11-09

来源:互联网

SQL code


create Table T1 (
    [变量类型]    [varchar](20),
    [行号]    int,
    [名称] [varchar](20)
)
create Table T2 (
    [string1]    [varchar](20),
    [string2]    [varchar](20),
    [Number1]     int,
    [Date1]         [varchar](20)
)

InSert Into T1
Select 'string',1,'申请人' union all
SELECT 'Number',1,'电话'  union all

insert into T2 
select 'neo','shanghai',4963159,'2011-11-09'



想得到
申请人 电话
neo 4963159

谢谢啦

作者: a15938708203   发布时间: 2011-11-09

把T1做一个90度旋转 然后与T2 JOIN

作者: fredrickhu   发布时间: 2011-11-09

SQL code
--------------------------------------------------------------------------
/*
数据库中tb表格如下
 
月份    工资   福利  奖金
1月     100    200   300
2月     110    210   310
3月     120    220   320
4月     130    230   330

我想得到的结果是

项目   1月    2月  3月  4月
工资   100    110  120  130
福利   200    210  220  230
奖金   300    310  320  330

就是说完全把表格的行列颠倒,有点像那种旋转矩阵,请问如何用sql 语句实现?
*/

if exists (select * from dbo.sysobjects
where id = object_id(N'[dbo].[p_zj]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[p_zj]
GO
/*--行列互换的通用存储过程(原著:邹建):将指定的表,按指定的字段进行行列互换*/

create proc p_zj
       @tbname sysname, --要处理的表名
       @fdname sysname, --做为转换的列名
       @new_fdname sysname='' --为转换后的列指定列名
as
declare @s1 varchar(8000) , @s2 varchar(8000),
        @s3 varchar(8000) , @s4 varchar(8000),
        @s5 varchar(8000) , @i varchar(10)
select @s1 = '' , @s2 = '' , @s3 = '' , @s4 = '' , @s5 = '' , @i = '0'
select @s1 = @s1 + ',@' + @i + ' varchar(8000)',
       @s2 = @s2 + ',@' + @i + '=''' + case isnull(@new_fdname , '') when '' then ''
       else @new_fdname + '=' end + '''''' + name + '''''''',
       @s3 = @s3 + 'select @' + @i + '=@' + @i + '+'',['' + [' + @fdname + 
       ']+'']=''+cast([' + name + '] as varchar) from [' + @tbname + ']',
       @s4 = @s4 + ',@' + @i + '=''select ''+@' + @i,
       @s5 = @s5 + '+'' union all ''+@' + @i,
       @i=cast(@i as int)+1
from syscolumns
where object_id(@tbname)=id and name<>@fdname

select @s1=substring(@s1,2,8000),
       @s2=substring(@s2,2,8000),
       @s4=substring(@s4,2,8000),
       @s5=substring(@s5,16,8000)
exec('declare ' + @s1 + 'select ' + @s2 + @s3 + 'select ' + @s4 + '
exec(' + @s5 + ')')
go

--用上面的存储过程测试:

create table Test(月份 varchar(4), 工资 int, 福利 int, 奖金 int)
insert Test 
select '1月',100,200,300 union all
select '2月',110,210,310 union all
select '3月',120,220,320 union all
select '4月',130,230,330
go

exec p_zj 'Test', '月份' , '项目'

drop table Test
drop proc p_zj

/*
项目   1月         2月         3月         4月          
---- ----------- ----------- ----------- ----------- 
福利   200         210         220         230
工资   100         110         120         130
奖金   300         310         320         330

(所影响的行数为 3 行)
*/

/*
静态写法(SQL2005)
*/
--测试环境
create table Test(月份 varchar(4), 工资 int, 福利 int, 奖金 int)
insert Test
select '1月',100,200,300 union all
select '2月',110,210,310 union all
select '3月',120,220,320 union all
select '4月',130,230,330
go
--测试语句
SELECT * FROM 
(
  SELECT 考核月份,月份,金额 FROM 
     (SELECT 月份, 工资, 福利, 奖金 FROM Test) p
  UNPIVOT
     (金额 FOR 考核月份 IN (工资, 福利, 奖金))AS unpvt
) T
PIVOT
(MAX(金额)  FOR 月份 in ([1月],[2月],[3月],[4月]))AS pt

--测试结果

/*
考核月份  1月     2月      3月     4月
-------  -----  -----   ------  -------
福利200210220230
工资100110120130
奖金300310320330
*/

--删除环境
Drop table Test

作者: fredrickhu   发布时间: 2011-11-09

字段值作为字段类型真的不明智

作者: ssp2009   发布时间: 2011-11-09

另外 同一样的帖子不要发N遍 你不累么?

作者: fredrickhu   发布时间: 2011-11-09

SQL code
create Table T1 (
    [变量类型]    [varchar](20),
    [行号]    int,
    [名称] [varchar](20)
)
create Table T2 (
    [string1]    [varchar](20),
    [string2]    [varchar](20),
    [Number1]     int,
    [Date1]         [varchar](20)
)

InSert Into T1
Select 'string',1,'申请人' union all
SELECT 'Number',1,'电话'  
insert into T2 
select 'neo','shanghai',4963159,'2011-11-09'
go
declare @s nvarchar(4000)
select @s=isnull(@s+',','select ')+'['+[变量类型]+RTRIM([行号])+'] as '+QUOTENAME([名称]) from T1
exec(@s+' from t2')
/*
申请人    电话
neo    4963159
*/

作者: roy_88   发布时间: 2011-11-09

你直接回复就好,楼上两位版主很厉害也很尽责,这点问题他们肯定能解决的

作者: p2227   发布时间: 2011-11-09