每个可以有重复条目的事实(dname, ename, role)
表明测试用例过于简化。我怀疑测试用例应该是:
CREATE TEMP TABLE emp(dname text, ename text, role text, col1 text);
INSERT INTO emp VALUES
('D1','E11', 'Role1', 'foo1')
,('D1','E11', 'Role2', 'foo2')
,('D1','E12', 'Role1', 'foo3')
,('D1','E12', 'Role1', 'foo4')
,('D2','E12', 'Role2', 'foo5');
然后@Clodoaldo 的(否则很好)查询将不得不使用:
SELECT DISTINCT dname, ename, role
代替:
SELECT DISTINCT *
另一种方法是交叉表查询:
SELECT * FROM crosstab(
$x$
SELECT dname, role, count(DISTINCT ename)::int
FROM emp
GROUP BY dname, role
$x$
,$y$SELECT DISTINCT role FROM emp ORDER BY 1$y$)
AS ct (dname text, "Role1" text, "Role2" int);
您需要tablefunc
为此安装。此相关答案中有关此查询的更多详细信息:
PostgreSQL Crosstab Query
您必须在列定义列表中列出所有可能的角色。