有朋友問「如何直接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. XXE注入攻击与防御

    在研究XXE注入攻击之前先了解一下什么是XXE 定义 XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言.XML文档结构包括 ...

  2. Struts2 --简单留言系统

    1.创建数据表,与servlet中相同 2.创建web项目,添加struts2模块,url 选 /*,web.xml中会自动注册struts2,同时src下会自动生成struts2配置文件struts ...

  3. HDFS高级功能

    HDFS的六大高级特性: 安全模式 安全模式是HDFS所处的一种特殊状态,在这种状态下,文件系统只接受读数据请求,而不接受删除.修改等变更请求.在NameNode主节点启动时,HDFS首先进入安全模式 ...

  4. 《linux性能及调优指南》 3.3 内存瓶颈

    摘要:3.3内存瓶颈OnaLinuxsystem,manyprogramsrunatthesametime.Theseprogramssupportmultipleusers,andsomeproce ...

  5. string类和stringBuilder类

    字符串是C#中的一种重要数据类型,在项目开发中,离不开字符串操作.C#提供了string类实现字符串操作.于Convert类相似,string类中方法有静态方法和非静态方法.注意,在C#中String ...

  6. kotlin的安装(一)

    1.下载Kotlin Compiler Kotlin 命令行环境主要依赖就是Kotlin Compiler,目前最新版本是 1.1.2-2.其下载链接是:https://github.com/JetB ...

  7. 编码,基本数据类型,str索引和切片,for循环

    1. 编码 1. 最早的计算机编码是ASCII. 美国人创建的. 包含了英文字母(大写字母, 小写字母). 数字, 标点等特殊字符!@#$% 128个码位 2**7 在此基础上加了一位 2**8 8位 ...

  8. 安全测试8_Web安全实战2(暴力破解)

    1.暴力破解的概念 顾名思义,暴力破解的原理就是使用攻击者自己的用户名和密码字典,一个一个去枚举,尝试是否能够登录.因为理论上来说,只要字典足够庞大,枚举总是能够成功的! 2.暴力破解的实战 在有了之 ...

  9. gentoo intel 安装桌面

    首先增加 vim ~/.xinitrc [[ -f ~/.Xresources ]] && xrdb -merge ~/.Xresources # dbus before fcitx ...

  10. uva-10085-搜索-最远状态的八数码

    直接bfs即可,取最后一个状态 #include <iostream> #include <stdio.h> #include <string> #include ...