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

先準備測試資料如下,

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

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

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

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

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

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

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

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

[SQL]UNPIVOT 多個欄位的更多相关文章

  1. [Database][SQL] 取得SQLServer中某一欄位名稱所在的資料表及欄位相關資訊

    取得SQLServer中某一欄位名稱所在的資料表及欄位相關資訊  

  2. PL/SQL Developer 在windows7 64位系统下连Oaracle11g64位系统的解决经验

    PL/SQL Developer 在windows7 64位系统下连Oaracle11g64位系统的解决经验 一.问题现象及解决方法 现象: 1.PL/SQL 无法登录64位数据库 2.在PL/SQL ...

  3. Win8.1OS64位oracle11安装配置及PL/SQL Developer怎样连接64位oracle

    Oracle 为什么选择oracle 1.oracle可以在主流的平台上执行,而相对于sql server仅仅支持windows,而windows在wr手里攥着呢,所以你懂的.在安全性上来讲,非常多地 ...

  4. [ SQLServer ] 數字類型的欄位細節 - 轉載

    [MSSQL] 欄位開立(2) - decimal, numeric, float, real, money 的抉擇 https://dotblogs.com.tw/henryli/2015/06/1 ...

  5. sql 除法运算 保留两位小数

    sql 除法运算 保留两位小数 SELECT 1530/60 select cast(1530*1./60 as decimal(18,1))

  6. [T-SQL] NCL INDEX 欄位選擇效能影響-解析

    因為這篇文章寫的比較長一些,我就將總結先列出來 總結 1. 除了WHERE條件外,JOINColumn除了記得建立索引,也要注意到選擇性的高低,如果真的找不到可用的Column,可以考慮在兩邊關聯的表 ...

  7. PL/SQL Developer如何连接64位的Oracle图解

    在64位Win7系统上安装64位的Oracle数据库,但是没有对应的64位PL/SQL Developer,此时就不能使用PL/SQL Developer来进行直接连接的,所以要想实现连接还得需要其他 ...

  8. PL/SQL Developer连接本地64位Oracle数据库

    1.安装oracle Clinet 首先到Oracle官网上去下载一个Oracle 11g Client(我的是11g的oracle),不过需要先申请一个Oracle 帐号,才能下载. 目前下载地址: ...

  9. [正确配置]win7 PL/SQL 连接Oralce 11g 64位

    PL/SQL 版本号:15.0.5.1710 32位 win7 64位系统 instantclient 12.1 32位,PL/SQL不支持64位 关键问题 1.Not logged on 2.没有c ...

随机推荐

  1. Centos 7 下, 安装odoo 10

    1. Centos在虚拟机中, 最小化安装, 网络连接选择的是 桥接模式, 安装完成后, 是不能直接上网的, 输入root 和密码, 登录进去, 然后执行: [root@localhost ~]# v ...

  2. HBase脚本命令

    1. 脚本使用小结1.开启集群 start-hbase.sh 2.关闭集群 stop-hbase.sh 3.开启/关闭[所有]的regionserver.zookeeper hbase-daemons ...

  3. (转)驱动程序安装类(C#)

    原文地址:http://www.cnblogs.com/BoyXiao/archive/2011/03/31/2001535.html 回忆刚进公司那会儿,手头的第一个工作就是完成虚拟键盘,也就是通过 ...

  4. SpringBoot项目启用本地Tomcat

    1.修改pom.xml文件,配置<packaging>war</packaging>,使其发布的时候打包成war包 <groupId>com.owlforest&l ...

  5. webstorm命令行无法使用node-gyp进行编译

    换成cmd命令即可:

  6. linux的系统调优

    例1:找出前当系统中,CPU负载过高的服务器? 服务器1: load average: 0.15, 0.08, 0.01 1核 服务器2: load average: 4.15, 6.08, 6.01 ...

  7. ace admin

    .svg             image/svg+xml.woff            application/x-font-woff.woff2          application/x- ...

  8. <spark> error:启动spark后查看进程,进程中master和worker进程冲突

    启动hadoop再启动spark后jps,发现master进程和worker进程同时存在,调试了半天配置文件. 测试发现,当我关闭hadoop后 worker进程还是存在, 但是,当我再关闭spark ...

  9. 代码:jquery自定义插件 demo

    jquery自定义插件 demo 2016-1-13 只是一个简易的示例 <script type="text/javascript" src="http://cd ...

  10. PostgreSQL (简称gp)小集

    1. SQLyog & Navicat SQLyog可以管理 MySQL Navicat 可以管理 SQL Server,MySQL,PostgreSQL,SQLite 2. 日期及加减 no ...