[SQL]UNPIVOT 多個欄位

有朋友問「如何直接unpivot成2個欄位」,如下所示,

image

 

先準備測試資料如下,

01create table T (
02no varchar(10),
03yearx varchar(4),
04z_type varchar(1),
05A01 smallint,
06B01 smallint,
07A02 smallint,
08B02 smallint,
09A03 smallint,
10B03 smallint
11)
12go
13  
14insert into T VALUES('Z01','2012','1',100,-10,200,30,50,60);
15insert into T VALUES('Z01','2012','3',200,20,100,20,30,40);
16insert into T VALUES('Z01','2013','3',300,30,10,50,70,30);
17  
18SELECT * FROM T;

image

 

因為原本欄位A01, A02, A03要放到欄位A,B01, B02, B03要放到欄位B,所以需要2個UNPIVOT,如下,

1SELECT no, yearx, z_type, A, B, x1, x2 
2FROM 
3   (SELECT *
4   FROM T) p
5UNPIVOT ( A FOR x1 IN (A01, A02, A03) )AS UnA
6UNPIVOT ( B FOR x2 IN (B01, B02, B03) )AS UnB

image

 

上面的輸出筆數為27筆,而我們可以發現,x1, x2欄位中,A01 搭配 B01,A02 要搭配 B02,A03 要搭配 B03,如下圖所示,

image

 

所以我們需要再加入 關鍵的 WHERE 條件, RIGHT(x1, 1) = RIGHT(x2, 1),就可以過濾出我們所需要的資料,如下,

1SELECT no, yearx, z_type, A, B, x1, x2 
2FROM 
3   (SELECT *
4   FROM T) p
5UNPIVOT ( A FOR x1 IN (A01, A02, A03) )AS UnA
6UNPIVOT ( B FOR x2 IN (B01, B02, B03) )AS UnB
7WHERE RIGHT(x1, 1) = RIGHT(x2, 1)

image

 

如果要加上序號的話,就加入 ROW_NUMBER 就可以了,如下,

01SELECT *
02, ROW_NUMBER() OVER(PARTITION BY no, yearx, z_type ORDER BY  no, yearx, z_type) AS SEQX
03FROM
04(
05SELECT no, yearx, z_type, A, B, x1, x2 
06FROM 
07   (SELECT *
08   FROM T) p
09UNPIVOT ( A FOR x1 IN (A01, A02, A03) )AS UnA
10UNPIVOT ( B FOR x2 IN (B01, B02, B03) )AS UnB
11WHERE RIGHT(x1, 1) = RIGHT(x2, 1)
12) T2

image

 

转载于:https://www.cnblogs.com/Nina-piaoye/p/3166794.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值