在PostgreSQL中查询问题(行值到列)

时间:2013-12-16 21:13:16

标签: sql database postgresql pivot

我一直在寻找这个,但是我无法前进并且正在停止我正在进行的项目。 我的问题(我认为)很简单,但因为我不熟悉postgresql,所以我被困在第1页。

我有这张桌子:

"id";"date";"name";"seller";"order";"result"
"1";"2013-12-10 11:09:28.76";"adam";"mu";1;"5"
"1";"2013-12-10 11:09:28.76";"adam";"mu";2;"3"
"1";"2013-12-10 11:09:28.76";"adam";"mu";3;"1"
"2";"2013-12-10 11:10:26.059";"eve";"wa";1;"3"
"2";"2013-12-10 11:10:26.059";"eve";"wa";2;"9"
"2";"2013-12-10 11:10:26.059";"eve";"wa";3;"5"
"3";"2013-12-10 11:11:34.746";"joshua";"mu";1;"2"
"3";"2013-12-10 11:11:34.746";"joshua";"mu";2;"2"
"3";"2013-12-10 11:11:34.746";"joshua";"mu";3;"9"

创作脚本:

CREATE TABLE myTable
(
  id character varying(50) NOT NULL,
  date timestamp without time zone NOT NULL,
  name character varying(64) NOT NULL,
  seller character varying(64) NOT NULL,
  order integer NOT NULL,
  result character varying(64)
)
WITH (OIDS=FALSE);
ALTER TABLE myTable OWNER TO postgres;

(注意:我无法修改该表的结构)

我希望得到这样的结果,以便使用复制功能并将其写入文件:

"id";"date";"name";"seller";"result_1";"result_2";"result_3"
"1";"2013-12-10 11:09:28.76";"adam";"mu";"5";"3";"1"
"2";"2013-12-10 11:10:26.059";"eve";"wa";"3";"9";"5"
"3";"2013-12-10 11:11:34.746";"joshua";"mu";"2";"2";"9"

我查看了“交叉表”功能,但是我无法在我的环境中完成这项工作,而且我想在输出中丢失列顺序。

我不是查询专家,所以我非常关注:(

任何帮助将不胜感激。提前谢谢!

3 个答案:

答案 0 :(得分:2)

CASE陈述是穷人代替crosstab()函数的代理人:

SELECT a.id
      ,max(CASE WHEN myorder = 1 THEN result END) AS result_1
      ,max(CASE WHEN myorder = 2 THEN result END) AS result_2
      ,max(CASE WHEN myorder = 3 THEN result END) AS result_3
FROM   mytab
GROUP  BY id
ORDER  BY id;

只需要一次表扫描,因此 比多次连接快。

BTW,绝不要使用order之类的{{1}}作为标识符。

此问题的详细信息以及此相关问题下的正确交叉表()查询:
reserved words

答案 1 :(得分:1)

这不是您想要的,但它会为每个ID为结果字段创建数组。与MySQL中的group_concat类似

 SELECT id, array_agg(result)
 FROM table
 GROUP BY id

答案 2 :(得分:1)

如果不能使用交叉表(未安装tablefunc模块?) 这样的事情怎么样:

SELECT a.id,  b.myresult as one, c.myresult as two, d.myresult as three
FROM (SELECT id
      FROM mytab
      GROUP BY id) a
JOIN mytab b ON a.id = b.id AND b.myorder = 1
JOIN mytab c ON a.id = c.id AND c.myorder = 2
JOIN mytab d ON a.id = d.id AND d.myorder = 3

http://www.sqlfiddle.com/#!15/a3780/6