我一直在寻找这个,但是我无法前进并且正在停止我正在进行的项目。 我的问题(我认为)很简单,但因为我不熟悉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"
我查看了“交叉表”功能,但是我无法在我的环境中完成这项工作,而且我想在输出中丢失列顺序。
我不是查询专家,所以我非常关注:(
任何帮助将不胜感激。提前谢谢!
答案 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