我正在尝试转置一个有两个行名的表。
Postgres文档提到crosstab()函数只能处理一个行名,但我有两个行名,比如first name和last name。
我的初始表是:

fn |  ln |  file_type |attribute
--------------------------------
A  |  1  |  cat1     |abc
A  |  2  |  cat1     |gth
A  |  1  |  cat2     |fgh
B  |  1  |  cat2     |gth

我希望我的最后一个表有两个初始行,并且文件类型被转置
 fn |  ln |  cat1 | cat2
--------------------------------
 A  |   1 |  abc  | fgh
 A  |   2 |  gth  |
 B  |   1 |       | gth

我还没有找到我需要的功能工具。。。
版本为Postgres 9.3

最佳答案

使用附加模块tablefunc中的crosstab()
这里的具体困难是“行名”由两列组成。为了查询的目的,我进行了连接,但没有在末尾显示连接的列。
假设fnlnNOT NULL。未测试:

SELECT fn, ln, cat1, cat2
FROM crosstab(
       'SELECT fn || ln AS row_name, fn, ln, file_type, attribute
        FROM   t
        ORDER  BY fn, ln, file_type'

      ,$$VALUES ('cat1'::text), ('cat2')$$)
AS t (row_name text, fn text, ln int, cat1 text, cat2 text);

另一个选择是添加一个代理项“row name”,它带有一个类似于dense_rank()的窗口函数,并将定义两列视为“额外列”。例子:
Postgresql crosstab query with multiple "row name" columns
基础知识:
PostgreSQL Crosstab Query

关于sql - 具有2个(或更多)行名的交叉表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21142765/

10-15 19:46