Postgresql GROUP BY正在创建多行而不是1行

Postgresql GROUP BY正在创建多行而不是1行,postgresql,group-by,Postgresql,Group By,这是在Postgresql 8.2中,我创建了以下视图,并希望结果按“employee”字段分组: CREATE OR REPLACE VIEW stg.vw_dw_employees AS SELECT zvpa0001.pernr AS employee, CASE WHEN zvpa0105.usrty::text = '0001'::text THEN max(zvpa0105.usrid::text) ELSE NULL::text END AS login, CASE WHE

这是在Postgresql 8.2中,我创建了以下视图,并希望结果按“employee”字段分组:

CREATE OR REPLACE VIEW stg.vw_dw_employees AS 
SELECT zvpa0001.pernr AS employee, 
CASE
WHEN zvpa0105.usrty::text = '0001'::text 
THEN max(zvpa0105.usrid::text)
ELSE NULL::text
END AS login, 
CASE
WHEN zvpa0001.sname IS NULL THEN              
max(upper(zvpa0001.ename::text))::character varying
ELSE zvpa0001.sname
END AS employee_name, 
CASE
WHEN zvpa0105.usrty::text = '0015'::text 
THEN max(zvpa0105.usrid::text)
ELSE NULL::text
END AS gid, 
CASE
WHEN zvpa0105.usrty::text = '0012'::text 
THEN max(zvpa0105.usrid::text)
ELSE NULL::text
END AS webkey
FROM src.zvpa0001
LEFT JOIN src.zvpa0105 
ON zvpa0001.pernr = zvpa0105.pernr
GROUP BY zvpa0001.pernr, zvpa0105.usrty, zvpa0001.sname, zvpa0001.persg;
当我查询视图时,我看到同一个员工有多行。


我已经厌倦了使用子查询进行一些变通,但无法产生所需的结果。任何帮助都将不胜感激。

分组依据并不是在所有情况下都创建一行,它意味着员工34会根据您为“分组”功能选择的字段进行多次分组

试着根据你的疑问背后的逻辑进行推理

希望结果按“员工”字段分组:

CREATE OR REPLACE VIEW stg.vw_dw_employees AS 
SELECT zvpa0001.pernr AS employee, 
CASE
WHEN zvpa0105.usrty::text = '0001'::text 
THEN max(zvpa0105.usrid::text)
ELSE NULL::text
END AS login, 
CASE
WHEN zvpa0001.sname IS NULL THEN              
max(upper(zvpa0001.ename::text))::character varying
ELSE zvpa0001.sname
END AS employee_name, 
CASE
WHEN zvpa0105.usrty::text = '0015'::text 
THEN max(zvpa0105.usrid::text)
ELSE NULL::text
END AS gid, 
CASE
WHEN zvpa0105.usrty::text = '0012'::text 
THEN max(zvpa0105.usrid::text)
ELSE NULL::text
END AS webkey
FROM src.zvpa0001
LEFT JOIN src.zvpa0105 
ON zvpa0001.pernr = zvpa0105.pernr
GROUP BY zvpa0001.pernr, zvpa0105.usrty, zvpa0001.sname, zvpa0001.persg;
然后实际操作:按员工分组

所有其他列都需要成为聚合函数的一部分


我消除了一些干扰,但查询可能并不理想。你的演员很可疑。如果z1.pernr是主键,您可以进一步简化。但是基本信息丢失了。

谢谢你的建议。不过我想出来了。SELECT DISTINCT ON执行了此操作。

为什么选择ZVPA001.ename::text。列的数据类型是什么?表格定义将澄清这一问题和其他问题。在psql.Postgres 8.2中使用\d zvpa0001可以得到什么?真正地您应该尽快计划升级到维护版本。