想用 PIVOT 实现行转列时发现一行如果有多个字段要转成列时不知怎样去转,如下例子表A,请大侠帮忙,不要用case或拼接字段解答表A
大类 类别 代码 购买数 退还数 实售数
上身 外套 A 7 1 6
下身 单裙 B 8 3 5转换成大类 上身 下身
类别 外套 单裙
代码 A B
购买数 7 8
退还数 1 3
实售数 6 5
大类 类别 代码 购买数 退还数 实售数
上身 外套 A 7 1 6
下身 单裙 B 8 3 5转换成大类 上身 下身
类别 外套 单裙
代码 A B
购买数 7 8
退还数 1 3
实售数 6 5
只能一行行賦值
use Tempdb
go
--> -->
if not object_id(N'A') is null
drop table A
Go
Create table A([大类] nvarchar(2),[类别] nvarchar(2),[代码] nvarchar(1),[购买数] int,[退还数] int,[实售数] int)
Insert A
select N'上身',N'外套',N'A',7,1,6 union all
select N'下身',N'单裙',N'B',8,3,5
Go
declare @s nvarchar(4000),@s2 nvarchar(4000),@s3 nvarchar(4000),@s4 nvarchar(4000)
select
@s=isnull(@s+',','declare ')+'@'+rtrim(Colid)+' nvarchar(4000)',
@s2=isnull(@s2+',','select ')+'@'+rtrim(Colid)+'=N'''+case when @s2 is not null then 'union all select' else ' select ' end+N' [大类]=N'''+quotename(Name,'''')+'''''',
@s3=isnull(@s3,'')+'select @'+rtrim(Colid)+'=@'+rtrim(Colid)+N'+'',''+quotename([大类])+''=N''+quotename('+quotename(Name)+','''''''') from A ',
@s4=isnull(@s4+'+','')+'@'+rtrim(Colid)
from
syscolumns
where
id=object_id('A') and Name not in(N'大类')
--print @s+' '+@s2+' '+@s3+' exec('+@s4+')' --显示执行语句
exec(@s+' '+@s2+' '+@s3+' exec('+@s4+')') /*
大类 上身 下身
类别 外套 单裙
代码 A B
购买数 7 8
退还数 1 3
实售数 6 5
*/