关于网友提出的“ 怎样实现多行多列转换”问题疑问,本网通过在网上对“ 怎样实现多行多列转换”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:
问题: 怎样实现多行多列转换描述:
表1:
aa bb cc dd dd-cc (dd-cc)/cc month
01 电器 125 623 498 3.984 4月
02 电器 314 766 452 1.439 6月
01 家具 92 167 75 0.815 11月
03 五金 864 659 -205 -0.237 6月
03 布料 793 516 -277 -0.349 11月
其中,dd-cc字段=dd-cc的值,(dd-cc)/cc 字段=(dd-cc)/cc 的值
想实现如下结果:
aa bb XX 4月 6月 11月
01 电器 cc 125
01 电器 dd 623
01 电器 dd-cc 498
01 电器 (dd-cc)/cc 3.984
01 家具 cc 92
01 家具 dd 167
01 家具 dd-cc 75
01 家具 (dd-cc)/cc 0.815
02 电器 cc 314
02 电器 dd 766
02 电器 dd-cc 452
02 电器 (dd-cc)/cc 1.439
03 五金 cc 864
03 五金 dd 659
03 五金 dd-cc -205
03 五金 (dd-cc)/cc -0.237
03 布料 cc 793
03 布料 dd 516
03 布料 dd-cc -277
03 布料 (dd-cc)/cc -0.349
若使用pivot 或unpivot只能单列单行转换,不知道该怎样实现这样的结果,能否不用case when来写?
解决方案1:
e.g.
use Tempdb
go
--> --> 中国风(Roy)生成测试数据
if not object_id(N'Tempdb..#T') is null
drop table #T
Go
Create table #T([aa] nvarchar(22),[bb] nvarchar(22),[cc] decimal(18,4),[dd] decimal(18,4),[dd-cc] decimal(18,4),[(dd-cc)/cc] decimal(18,4),[month] nvarchar(23))
Insert #T
select N'01',N'电器',125,623,498,3.984,N'4月' union all
select N'02',N'电器',314,766,452,1.439,N'6月' union all
select N'01',N'家具',92,167,75,0.815,N'11月' union all
select N'03',N'五金',864,659,-205,-0.237,N'6月' union all
select N'03',N'布料',793,516,-277,-0.349,N'11月'
Go
SELECT *
FROM ( SELECT *
FROM #T UNPIVOT( Value FOR XX IN ( [cc], [dd], [dd-cc],[(dd-cc)/cc] ) ) AS t1
) AS t2 PIVOT( MAX(Value) FOR [month] IN ( [4月], [6月], [11月] ) ) AS t3
ORDER BY aa,bb,CASE XX WHEN 'cc' THEN 1 WHEN 'dd' THEN 2 WHEN 'dd-cc' THEN 3 ELSE 4 END;
/*
aa bb XX 4月 6月 11月
01 电器 cc 125.0000 NULL NULL
01 电器 dd 623.0000 NULL NULL
01 电器 dd-cc 498.0000 NULL NULL
01 电器 (dd-cc)/cc 3.9840 NULL NULL
01 家具 cc NULL NULL 92.0000
01 家具 dd NULL NULL 167.0000
01 家具 dd-cc NULL NULL 75.0000
01 家具 (dd-cc)/cc NULL NULL 0.8150
02 电器 cc NULL 314.0000 NULL
02 电器 dd NULL 766.0000 NULL
02 电器 dd-cc NULL 452.0000 NULL
02 电器 (dd-cc)/cc NULL 1.4390 NULL
03 布料 cc NULL NULL 793.0000
03 布料 dd NULL NULL 516.0000
03 布料 dd-cc NULL NULL -277.0000
03 布料 (dd-cc)/cc NULL NULL -0.3490
03 五金 cc NULL 864.0000 NULL
03 五金 dd NULL 659.0000 NULL
03 五金 dd-cc NULL -205.0000 NULL
03 五金 (dd-cc)/cc NULL -0.2370 NULL
*/