PostgreSQL:将2列结果集转换为单行表

时间:2015-05-28 08:53:38

标签: postgresql pivot

挣扎着我的想法是一个简单的操作...

编辑:此处提供的SQLFiddle:fabfile

使用PostgreSQL 9.4,假装我有一个返回这个两列集的查询:

CATEGORY | TOTAL
all      | 14
soccer   | 5
baseball | 6
hockey   | 3

但我更喜欢将其转换为单行集:

ALL | SOCCER | BASEBALL | HOCKEY
14  | 5      | 6        | 3

换句话说,我想要我所有的" CATEGORY"要成为列的值,使用相应的" TOTAL"值放在相应列下的第一行。

我一直在尝试使用CROSSTAB()......但到目前为止,我收到了以下错误:

ERROR: a column definition list is required for functions returning "record"

作为参考,这是我试图将其作为我的SQL命令:

SELECT * FROM crosstab(
$$
    WITH "countTotal" AS (
        SELECT text 'all' AS "sportType", COUNT(*) AS "total"
        FROM log
        WHERE type = 'SPORT_EVENT_CREATED'
        GROUP BY "sportType"
    ),
    "countBySportType" AS (
        SELECT sport_type AS "sportType", COUNT(*) AS "total"
        FROM log
        WHERE type = 'SPORT_EVENT_CREATED'
        GROUP BY "sportType"
    )
    SELECT * FROM "countTotal" 
    UNION 
    SELECT * FROM "countBySportType"
$$
)

1 个答案:

答案 0 :(得分:0)

我认为您必须指定输出列的名称和类型。来自postgres手册 tablefunc

  

声明交叉表函数返回setof记录,所以   必须在中定义输出列的实际名称和类型   调用SELECT语句的FROM子句,例如:
  SELECT * FROM crosstab('...') AS ct(row_name text, category_1 text, category_2 text);

您必须使用crosstabN(text)将其与动态列数一起使用。这个PostgreSQL Crosstab Query有关交叉表查询的大量详细信息。

另一篇帖子Dynamic alternative to pivot with CASE and GROUP BY