数据库

 首页 > 数据库 > postgresql > PostgreSQL数据库行转列函数使用方法介绍

PostgreSQL数据库行转列函数使用方法介绍

分享到:
【字体:
导读:
         摘要:开发同事说使用postgres的扩展行转列应用时有一个问题,示例如下一、环境OS:CentOS6.3DB:PostgreSQL9.3.0二、场景createtablet(daydate,equipmentvarchar(20),outputinteger);insertintotvalues(2010-04-01,DA...

PostgreSQL数据库行转列函数使用方法介绍

开发同事说使用postgres的扩展行转列应用时有一个问题,示例如下

一、环境

OS:CentOS 6.3
DB:PostgreSQL 9.3.0

二、场景

create table t(day date,equipment varchar(20),output integer);
insert into t values('2010-04-01','DAT501',100);
insert into t values('2010-04-01','DAT502',120);
insert into t values('2010-04-01','DAT503',130);
insert into t values('2010-04-02','DAT501',110);
insert into t values('2010-04-02','DAT502',105);
insert into t values('2010-04-03','DAT503',125);
insert into t values('2010-04-04','DAT501',100);
insert into t values('2010-04-04','DAT503',200);
--想得到如下结果
    day    | dat501 | dat502 | dat503
------------+--------+--------+--------
 2010-04-01 |    100 |    120 |    130
 2010-04-02 |    110 |    105 |   2010-04-03 |        |        |    125
 2010-04-04 |    100 |        |    200   
(4 rows)

--但是直接使用crosstab会导致第3,4行不准确,也就是说中间项为Null就会不准
test=# SELECT * FROM crosstab('select day, equipment, output from t order by 1,2')  AS t(day date, DAT501 integer, DAT502 integer,DAT503 integer);
    day    | dat501 | dat502 | dat503
------------+--------+--------+--------
 2010-04-01 |    100 |    120 |    130
 2010-04-02 |    110 |    105 |   2010-04-03 |    125 |        |     
 2010-04-04 |    100 |    200 |  (4 rows)

三、解决
crosstab还有一个包含两个输入参数的用法,用这个可以解决上述问题
test=# SELECT * FROM crosstab('select day, equipment, output from t order by 1,2',$$values('DAT501'::text),('DAT502'::text),('DAT503'::text)$$)  AS t(day date, DAT501 integer, DAT502 integer,DAT503 integer);
    day    | dat501 | dat502 | dat503
------------+--------+--------+--------
 2010-04-01 |    100 |    120 |    130
 2010-04-02 |    110 |    105 |   2010-04-03 |        |        |    125
 2010-04-04 |    100 |        |    200
(4 rows)--其他的写法,本质都一样
test=# SELECT * FROM crosstab('select day, equipment, output from t order by 1','select distinct equipment  from t order by 1')  AS t(day date, DAT501 integer, DAT502 integer,DAT503 integer);
    day    | dat501 | dat502 | dat503
------------+--------+--------+--------
 2010-04-01 |    100 |    120 |    130
 2010-04-02 |    110 |    105 |   2010-04-03 |        |        |    125
 2010-04-04 |    100 |        |    200
(4 rows)

四、说明
使用两个参数的crosstab其实更安全,推荐使用,其基础用法是

crosstab(text source_sql, text category_sql)
参考:
http://www.postgresql.org/docs/9.2/static/tablefunc.html

PostgreSQL数据库行转列函数使用方法介绍
分享到:
PostgreSQL编程接口之JDBC接口
PostgreSQL编程接口之JDBC接口1介绍 pgJDBC驱动可以使Java程序以标准的数据库无关的java代码连接pg。除了一些pg特定的是纯java实现,因此只需要下载jar包就可以开干了。 扩展PostgreSQL的外,该驱动程序提供了相当完整的JDBC3规范的实施。目标是完全符兼容,但现在还没有兼容在todo list中列出 可以从下面的网站上...
PostgreSQL权限修改 : ALTER DEFAULT PRI...
PostgreSQL权限修改 : ALTER DEFAULT PRIVILEGES 关于权限的问题,曾经有个问题一直困扰着,由于关系不是很大一直没有深究,今天偶然的一次机会 看手册时看到 "ALTER DEFAULT PRIVILEGES" 命令,立即解决了困扰已久的问题。 --1 问题描述         在生产数据库中通常不允许开发人员使用生产帐号连接数据库...
  •         php迷,一个php技术的分享社区,专属您自己的技术摘抄本、收藏夹。
  • 在这里……