SQL Query将表值检索为列

时间:2013-03-31 23:54:22

标签: sql postgresql crosstab postgresql-9.0

我有一个表格视图如下:

(SELECT * FROM session_log_detail)
![Raw Data from table session_log_detail][1]

attr_name     attr_value     timestamp
A                123           1:20:45
B                234           1:20:45
C                567           1:20:45
D                234           1:20:45
A                098           2:58:20
B                478           2:58:20
"                 "              "

我想要检索的数据如下:

A         B          C           D
123      234        567         234
098      478

每行的时间戳值应相等,如果更改,则需要在下一行。 attr_valuestimestamp是随机值。

我有Postgres SQL 9.0

1 个答案:

答案 0 :(得分:1)

Tablefunc模块

您正在寻找“pivot”或“crosstab”。如果尚未安装附加模块tablefunc,请为每个数据库安装一次。在PostgreSQL 9.1+中,这已简化为:

CREATE EXTENSION tablefunc;

在旧版本(包括9.0)中,您必须使用以下命令从shell运行安装脚本:

psql -d dbname -f SHAREDIR/contrib/tablefunc.sql

对于Debian下的9.0版本,这将是:

psql -d dbname -f /usr/share/postgresql/9.0/contrib/tablefunc.sql

Postgres 9.0 in the fine manual的更多信息。

查询

看起来像这样:

SELECT * FROM crosstab(
       'SELECT ts, attr_name, attr_value
        FROM   session_log_detail
        ORDER  BY 1,2'

      ,$$VALUES ('A'::text), ('B'), ('C'), ('D')$$)
AS tbl ("ts" text, "A" int, "B" int, "c" int, "D" int);

我将您的列命名为ts,因为timestamp是Postgres中的函数名称,不应该用作标识符。

在这些相关答案中找到更多解释和详细信息:
PostgreSQL Crosstab Query
Dynamic alternative to pivot with CASE and GROUP BY