挣扎着我的想法是一个简单的操作...
编辑:此处提供的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"
$$
)
答案 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有关交叉表查询的大量详细信息。