怎样实现多行多列转换

来源:互联网  时间:2017/1/26 0:31:37

关于网友提出的“ 怎样实现多行多列转换”问题疑问,本网通过在网上对“ 怎样实现多行多列转换”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:

问题: 怎样实现多行多列转换
描述:

表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
*/

上一篇新建链接服务器,访问接口选择Oracle Provider for OLE DB 后无响应
下一篇一个非常简单的查询问题
明星图片
相关文章
《 怎样实现多行多列转换》由码蚁之家搜集整理于网络,
联系邮箱:mxgf168#qq.com(#改为@)