PostgreSQL按所有字段分组

son*_*ntd 6 postgresql

我有这样的查询:

SELECT
table1.*,
sum(table2.amount) as totalamount
FROM table1
join table2 on table1.key = table2.key
GROUP BY table1.*;
Run Code Online (Sandbox Code Playgroud)

我收到错误消息:“ table1.key”列必须出现在GROUP BY子句中或在聚合函数中使用。
有什么办法可以将“所有”字段分组?

Kau*_*yak 7

您必须指定group by 所选的所有列名,并且不属于聚合函数(SUM/COUNT等)

select c1,c2,c4,sum(c3) FROM  totalamount
group by c1,c2,c4;
Run Code Online (Sandbox Code Playgroud)

避免再次写入列的快捷方式group by是将它们指定为数字。

select c1,c2,c4,sum(c3) FROM  t
group by 1,2,3;
Run Code Online (Sandbox Code Playgroud)


kli*_*lin 6

没有用于按所有列分组的快捷方式语法,但是在描述的情况下可能没有必要。如果key是主键,则在使用时就足够了:

GROUP BY table1.key;
Run Code Online (Sandbox Code Playgroud)

  • 如果我们对视图而不是表的列进行分组,该怎么办?IIUC 没有任何与视图关联的键列。有没有? (4认同)

son*_*ntd 5

我找到了另一种解决方法,虽然不完美,但也许有用:

SELECT string_agg(column_name::character varying, ',') as columns
FROM information_schema.columns
WHERE table_schema = 'your_schema'
AND table_name   = 'your_table
Run Code Online (Sandbox Code Playgroud)

然后将此选择结果应用于主查询,如下所示:

$columns = $result[0]["columns"];

SELECT
table1.*,
sum(table2.amount) as totalamount
FROM table1
join table2 on table1.key = table2.key
GROUP BY $columns;
Run Code Online (Sandbox Code Playgroud)