PostgreSQL:将两列结果集透视到单行表中

PostgreSQL:将两列结果集透视到单行表中,postgresql,pivot,Postgresql,Pivot,我认为这是一个直截了当的手术 编辑:SQLFiddle可在以下位置获得: 使用PostgreSQL 9.4,假设我有一个返回以下两列集合的查询: CATEGORY | TOTAL all | 14 soccer | 5 baseball | 6 hockey | 3 但是,我更愿意将其集中到一个单行集合中: ALL | SOCCER | BASEBALL | HOCKEY 14 | 5 | 6 | 3 换句话说,我希望我的所有“CATEGORY”值

我认为这是一个直截了当的手术

编辑:SQLFiddle可在以下位置获得:

使用PostgreSQL 9.4,假设我有一个返回以下两列集合的查询:

CATEGORY | TOTAL
all      | 14
soccer   | 5
baseball | 6
hockey   | 3
但是,我更愿意将其集中到一个单行集合中:

ALL | SOCCER | BASEBALL | HOCKEY
14  | 5      | 6        | 3
换句话说,我希望我的所有“CATEGORY”值都变成列,相应的“TOTAL”值放在相应列下的第一行

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

错误:返回“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"
$$
)

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

交叉表函数声明为返回记录集,因此 必须在中定义输出列的实际名称和类型 调用SELECT语句的FROM子句,例如:
从交叉表(“…”)中选择*作为ct(行名称文本、类别1文本、类别2文本)

必须使用
crosstabN(text)
才能将其用于动态列数。这是关于交叉表查询的全部详细信息


还有一篇帖子

你能为表格创建SQLFIDLE吗?@NandakumarV SQLFIDLE链接已添加!