Pivoting是一项可以把行旋转为列的技术。在执行Pivoting的过程中可能会使用到聚合。Pivoting技术应用非常广泛。下面讨论的都是静态的Pivoting查询,即用户需要提前知道旋转的属性和列的值。对于动态Pivoting,需要动态地构造字符串。

开放架构

开发架构是一种用于频繁更改架构的一种设计模式。利用关系型数据库和SQL语句可以非常有效地处理DML,包括INSERT、SELECT、UPDATE和DELETE。
然而,DDL在频繁进行架构更改时显得十分不方便。例如城对表结构进行修改,用户必须添加、修改或删除列,而这种操作正是关系型数据库不擅长的方面。
因此,在频繁更改架构的情况下,可以在一个表中存储所有的数据,每行存储一个属性的值,多用VARCHAR来存储,因为其容纳各种类型的数据。下面的语句生成一张开发架构的表t.

CREATE TABLE t(
id INT,
attribute VARCHAR(10),
value VARCHAR(20),
PRIMARY KEY(id,attribute)
);
INSERT INTO t SELECT 1,'attr1','BMW';
INSERT INTO t SELECT 1,'attr2','100';
INSERT INTO t SELECT 1,'attr3','2010-01-01';
INSERT INTO t SELECT 2,'attr2','200';
INSERT INTO t SELECT 2,'attr3','2010-03-04';
INSERT INTO t SELECT 2,'attr4','M';
INSERT INTO t SELECT 2,'attr5','55.60';
INSERT INTO t SELECT 3,'attr1','SUV';
INSERT INTO t SELECT 3,'attr2','10';
INSERT INTO t SELECT 3,'attr3','2011-11-11';
表的内容如下
aaarticlea/png;base64,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" alt="" />
从上面的例子中可以看到,在对通过开放架构设计的表进行添加、修改或删除表和列时,只需要通过INSERT、UPDATE、DELETE操作来完成逻辑架构的更改即可。当然使用这种方法可能导致数据库的其他特性无法使用,如完整性约束、SQL优化乖,同时查询数据变得不如之前的SQL语句来得直接和直观。所以,对于利用开放架构设计的表,一般使用Pivoting技术来查询数据。
Privoting技术需要和聚合一起使用,首先要确定结果的行数与表中行数的关系。对于开放架构表t,应该有3行5列,这可以通过分组id来得到。因此可以通过下列Pivoting进行行列互转以得到数据。

SELECT id,
MAX(CASE WHEN attribute='attr1' THEN value END) AS attr1,
MAX(CASE WHEN attribute='attr2' THEN value END) AS attr2,
MAX(CASE WHEN attribute='attr3' THEN value END) AS attr3,
MAX(CASE WHEN attribute='attr4' THEN value END) AS attr4,
MAX(CASE WHEN attribute='attr5' THEN value END) AS attr5
FROM t
GROUP BY id;

Pivoting先根据id进行分组,确定行列互转后记录的行数。之后通过已知的5个属性来确定行列互转后有5列数据,并通过CASE得到每列的值。由于使用了分组技术,因此一定要使用分组函数来取得列的值,故这里使用MAX函数,当然也可以使用MIN函数。最后得到的结果如下图

aaarticlea/png;base64,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" alt="" />

这种旋转方式是非常高效的,因为它只对表进行一次扫描。另外,这是一种静态的Pivoting,用户必须事件知道一共有多少个属性,然而对于一般开放架构表,用户都会定义一个最大的属性个数,这样可以比较容易进行Pivoting
 

关系除法

关系除法(Rational Divistion)和常见的关系运算JOIN、SEMI JOIN一样,都是一个关系代数。
当除数集合中的元素数量较小时,Pivoting可用于解决关系除法问题。先通过创建表t并填充数据。

CREATE TABLE t1 (
orderid VARCHAR(10) NOT NULL,
productid INT NOT NULL,
PRIMARY KEY(orderid,productid)
);
INSERT INTO t1 SELECT 'A',1;
INSERT INTO t1 SELECT 'A',2;
INSERT INTO t1 SELECT 'A',3;
INSERT INTO t1 SELECT 'A',4;
INSERT INTO t1 SELECT 'B',2;
INSERT INTO t1 SELECT 'B',3;
INSERT INTO t1 SELECT 'B',4;
INSERT INTO t1 SELECT 'C',3;
INSERT INTO t1 SELECT 'C',4;
INSERT INTO t1 SELECT 'D',
表的内容如下
aaarticlea/png;base64,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" alt="" />
表t存储订单中包含的产品,比如A订单中包含的产品的ID为1、2、3、4,B订单中所包含的产品为2、3、4,以此类推。这是一个比较典型的关系除法问题。用Pivoting技术可以反订单中的产品旋转到单独的列中。例如要查询包含productid为2、3、4的订单,可以采用如下方法:

SELECT orderid
FROM (
SELECT
orderid,
MAX(CASE WHEN productid=2 THEN 1 END) AS p2,
MAX(CASE WHEN productid=3 THEN 1 END) AS P3,
MAX(CASE WHEN productid=4 THEN 1 END) AS p4
FROM t1
GROUP BY orderid
) AS P
WHERE p2=1 AND p3=1 AND p4=1;

上述语句返回“A”和“B”。如果单独运行子查询,将会得到每个订单对应的产品ID,得到的结果如下

aaarticlea/png;base64,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" alt="" />

对于这个问题,聚合函数可以使用COUNT来替换MAX,这会让派生表的结果显得更加直观。此时若产品存在则返回1,不存在则返回0而不是NULL,故SQL语句可调整为

SELECT orderid
FROM (
SELECT
orderid,
COUNT(CASE WHEN productid=2 THEN 1 END) AS p2,
COUNT(CASE WHEN productid=3 THEN 1 END) AS P3,
COUNT(CASE WHEN productid=4 THEN 1 END) AS p4
FROM t1
GROUP BY orderid
) AS P
WHERE p2=1 AND p3=1 AND p4=1;

格式化聚合函数

Privoting技术还可以用来 格式化聚合数据,一般用于报表的展现。为了演示用Pivoting技术来格式化,下面给出一个例子。先通过创建表t2并填充数据
CREATE TABLE t2 (
orderid INT NOT NULL,
orderdate DATE NOT NULL,
empid INT NOT NULL,
custid VARCHAR(10) NOT NULL,
qty INT NOT NULL,
PRIMARY KEY (orderid,orderdate)
);
INSERT INTO t2 SELECT 1,'2010-01-02','3','A',10;
INSERT INTO t2 SELECT 2,'2010-04-02','2','B',20;
INSERT INTO t2 SELECT 3,'2010-05-02','1','A',30;
INSERT INTO t2 SELECT 4,'2010-07-02','3','D',40;
INSERT INTO t2 SELECT 5,'2011-01-02','4','A',20;
INSERT INTO t2 SELECT 6,'2011-01-02','3','B',30;
INSERT INTO t2 SELECT 7,'2011-01-02','1','C',40;
INSERT INTO t2 SELECT 8,'2009-01-02','2','A',10;
INSERT INTO t2 SELECT 9,'2009-01-02','3','B',20;
表的内容如下
aaarticlea/png;base64,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" alt="" />
可以将表t2看作一张汇总表,比如网上商城的购物明细。这份汇总表显示了订单号、订单日期、员工编号、消费者编号和订单数量。要在此汇总表的基础上进一步统计每个月消费者每年的数量,可能会想到分组来得到结果,例如
SELECT custid,YEAR(orderdate) AS year,SUM(qty) AS sum_qty
FROM t2 GROUP BY custid,YEAR(orderdate)
运行结果如下
aaarticlea/png;base64,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" alt="" />
上述结果没有任何问题,只是显示的可能不够直观。如果可以通过旋转得到输出结果,那就直观和清晰多了。
这里同样可以使用Pivoting技术。与之前唯一的不同是,此处不再使用聚合函数MAX,而是使用SUM函数。这个解决方案的SQL语句如下:

SELECT custid,
IFNULL(SUM(CASE WHEN orderyear=2009 THEN qty END),0) AS '2009',
IFNULL(SUM(CASE WHEN orderyear=2010 THEN qty END),0) AS '2010',
IFNULL(SUM(CASE WHEN orderyear=2011 THEN qty END),0) AS '2011'
FROM
(SELECT custid,YEAR(orderdate) AS orderyear,qty FROM t2) AS p
GROUP BY custid;
上述SQL语句中的IFNULL函数用来将NULL值返回为0,代表该年消费者没有产生任何订单操作。
使用Pivoting技术来格式化聚合数据会遇到一个问题,即当旋转的元素非常多时,会产生较长的查询字符串。要缩短查询的字符长度,可以预先产生一张矩阵表,包含每个要旋转列的属性,运行如下语句创建并填充矩阵表Matrix

CREATE TABLE Matrix (
orderyear INT PRIMARY KEY,
y2009 INT NULL,
y2010 INT NULL,
y2011 INT NULL
);
INSERT INTO Matrix SELECT 2009,1,0,0;
INSERT INTO Matrix SELECT 2010,0,1,0;
INSERT INTO Matrix SELECT 2011,0,0,1;
矩阵表Matrix的内容如下
aaarticlea/png;base64,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" alt="" />
因此可以通过将表t和表maxtrix进行连接把原来的:
SUM(CASE WHEN orderyear=n THEN qty END) AS N
替换为SUM(qty*yN) AS N
完整的SQL查询语句为:

SELECT custid,
SUM(qty*y2009) AS '2009',
SUM(qty*y2010) AS '2010',
SUM(qty*y2011) AS '2011'
FROM
(SELECT custid,YEAR(orderdate) AS orderyear,qty FROM t2) AS O
INNER JOIN Matrix AS P
ON O.orderyear=P.orderyear
GROUP BY custid;
运行结果如下
aaarticlea/png;base64,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" alt="" />
Unpivoting
可以将Unpivoting看做Pivoting的反向操作,即将列旋转为行。要完成这个示例,需要根据下列语句创建并填充表p,

CREATE TABLE p (
custid VARCHAR(10) NOT NULL,
y2009 INT NULL,
y2010 INT NULL,
y2011 INT NULL,
PRIMARY KEY (custid)
);
INSERT INTO p
SELECT
custid,
IFNULL(SUM(CASE WHEN orderyear=2009 THEN qty END), 0) AS '2009',
IFNULL(SUM(CASE WHEN orderyear=2010 THEN qty END), 0) AS '2010',
IFNULL(SUM(CASE WHEN orderyear=2011 THEN qty END), 0) AS '2011'
FROM
(SELECT custid, YEAR(orderdate) AS orderyear, qty
FROM t2 ) AS P
GROUP BY custid;

这里把t2表返回后的内容导入到表p中,如果想得到t2表直接聚合得到的结果,这个问题就变成了Unpivoting问题。解决这个问题需要将列旋转为行。这里使用的技巧是对每行数据产生3个副本,每个副本产生一个需要旋转的列,这个过程可以通过如下的CROSS JOIN来完成。

SELECT * FROM
p,
(SELECT 2009 AS orderyear
UNION ALL SELECT 2010
UNION ALL SELECT 2011) AS o
得到以下结果
aaarticlea/png;base64,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" alt="" />
接着问题就简单了,只需根据orderyear列来取得对应旋转列的值,例如:

CASE orderyear
WHEN 2009 THEN y2009
WHEN 2010 THEN y2010
WHEN 2011 THEN y2011
END AS qty
因此这个Unpivoting问题的解决方案如下
SELECT custid,orderyear,
CASE orderyear
WHEN 2009 THEN y2009
WHEN 2010 THEN y2010
WHEN 2011 THEN y2011
END AS qty
FROM
p,
(SELECT 2009 AS orderyear
UNION ALL SELECT 2010
UNION ALL SELECT 2011) AS o
若要得到最终结果,则还需要过滤qty等于0的情况,因此最终的解决方案为:

SELECT custid,orderyear,qty
FROM (
SELECT custid,orderyear,
CASE orderyear
WHEN 2009 THEN y2009
WHEN 2010 THEN y2010
WHEN 2011 THEN y2011
END AS qty
FROM
p,
(SELECT 2009 AS orderyear
UNION ALL SELECT 2010
UNION ALL SELECT 2011) AS o
) AS M
WHERE qty <> 0

mysql列反转Pivoting的更多相关文章

  1. MySQL服务 - MySQL列类型、SQL模式、数据字典

    MySQL列类型的作用: 列类型可以简单理解为用来对用户往列种存储数据时做某种范围"限定",它可以定义数据的有效值(字符.数字等).所能占据的最大存储空间.字符长度(定长或变长). ...

  2. mysql基础: mysql列类型--字符串

    mysql列类型:整型   http://blog.csdn.net/jk110333/article/details/9342283 mysql列类型--时间和日期  http://blog.csd ...

  3. mysql基础:mysql列类型--时间和日期

    mysql列类型--整型 http://blog.csdn.net/jk110333/article/details/9342283 mysql列类型--字符串http://blog.csdn.net ...

  4. MySQL 列,可选择的数据类型(通过sql命令查看:`help create table;`)

    MySQL 列,可选择的数据类型(通过sql命令查看:help create table;) BIT[(length)] | TINYINT[(length)] [UNSIGNED] [ZEROFIL ...

  5. mysql列类型

    mysql三大列类型 整型 tinyint(占据空间:1个字节 存储范围  有符号  -128-127   无符号  0-255) smallint   mediumint    int    big ...

  6. Mysql 列转行group_concat函数,与行转列

    1.正常情况. SELECT JoinEventIds from nt_mainnum 2.使用group_concat函数 select group_concat(JoinEventIds) fro ...

  7. mysql 列类型以及属性特点

    整形列: 一个字节有8个位,例如:int 类型的列存入数字1,00000000 00000000 00000000 00000001它就在最低位置上存入一个1,由此可见是极大的浪费资源,所以在建立列类 ...

  8. mysql列的处理

    MySQL 添加列,修改列,删除列 示例:ALTER TABLE tb_financial MODIFY CREATE_TIME DATETIME(3) DEFAULT NULL COMMENT '录 ...

  9. mysql列类型char,varchar,text,tinytext,mediumtext,longtext的比较与选择

    储存不区分大小写的字符数据 TINYTEXT 最大长度是 255 (2^8 – 1) 个字符. TEXT 最大长度是 65535 (2^16 – 1) 个字符. MEDIUMTEXT 最大长度是 16 ...

随机推荐

  1. Nexus安装、使用说明、问题总结

    Nexus安装.使用说明.问题总结 1 . 私服简介 私服是架设在局域网的一种特殊的远程仓库,目的是代理远程仓库及部署第三方构件.有了私服之后,当 Maven 需要下载构件时,直接请求私服,私服上存在 ...

  2. idea类里面编译报错,快速定位快捷键设置

    settings---->keyMap------->Main menu----------->在搜索框里输入error,找到Next Highlighted Error 和Prev ...

  3. WebApi零碎总结

    1.如果Content-Type是application/json,而POST和PUT的参数是[FromBody] string value,那么如果curl -d的值是'{"Name&qu ...

  4. django中使用memcache的一些注意事项

    最近写django项目时在保存验证码方面要用到memcached,于是便查看了一些教程进行操作,结果确遇到了一系列问题,以下是一些容易遇到的雷区: 1.windows下memcached安装: -wi ...

  5. UWP关于图片缓存的那些破事儿

    看似简单的功能,实施起来却是有着一堆大坑. 按着基本功能来写吧 1.选择图片并显示到Image控件中 2.图片序列化为byte数组以及反序列化 3.本地存储与读取 1.选择图片: 逻辑就是使用File ...

  6. python网络爬虫开发实战(崔庆才)_14页_chromedriver环境配置和加载

    自己1,环境配置,我下载了相对应的Chromedriver(其实我也不知道对不对应,都是下载最新版的我猜应该会对应),然后在任何文件夹下输入command+shift+G,打开输入窗口,任何输入  / ...

  7. 利用java解压,并重命名

    由于工作需要,写了一个小工具,利用java来解压文件然后对文件进行重命名 主要针对三种格式,分别是zip,rar,7z,经过我的多次实践我发现网上的类库并不能解压最新的压缩格式 对于zip格式: ma ...

  8. unigui+fastReport实现web打印方案

    近日单位需要用到会议通知单的打印功能,故引出篇. unigui是delphi环境下快速开发web应用的优秀工具,不再赘述,下面直接记录使用搭配使用,基本逻辑就是: unigui实现数据录入和浏览的we ...

  9. 04、SQL 查询当天,本月,本周的记录

    SELECT * FROM 表 WHERE CONVERT(Nvarchar, dateandtime, 111) = CONVERT(Nvarchar, GETDATE(), 111)   ORDE ...

  10. 脑残式网络编程入门(五):每天都在用的Ping命令,它到底是什么?

    本文引用了公众号纯洁的微笑作者奎哥的技术文章,感谢原作者的分享. 1.前言   老于网络编程熟手来说,在测试和部署网络通信应用(比如IM聊天.实时音视频等)时,如果发现网络连接超时,第一时间想到的就是 ...