Sql 列必须出现在GROUP BY子句中或在聚合函数中使用

Sql 列必须出现在GROUP BY子句中或在聚合函数中使用,sql,postgresql,group-by,Sql,Postgresql,Group By,我有一个查询,它将在两个表之间留下连接并求和金额 SELECT l.code, SUM(p.amount) FROM locations l LEFT JOIN payments p ON p.location_code = l.code GROUP by l.code 它工作正常,这是输出 现在我想选择更多列,例如位置名称 SELECT l.code, l.location.name, SUM(p.amount) FROM loca

我有一个查询,它将在两个表之间留下连接并求和金额

SELECT
    l.code,
    SUM(p.amount)
FROM
    locations l
LEFT JOIN payments p 
ON p.location_code = l.code
GROUP by l.code
它工作正常,这是输出

现在我想选择更多列,例如位置名称

SELECT
    l.code,
    l.location.name,
    SUM(p.amount)
FROM
    locations l
LEFT JOIN payments p 
ON p.location_code = l.code
GROUP by l.code
然而,我面对这个错误

Query 1 ERROR: ERROR:  column "l.location_name" must appear in the GROUP BY clause or be used in an aggregate function
LINE 3:  l.location_name,
如果将来需要选择更多列,则不可通过其向组中添加位置名称

如何修改查询以支持更多列选择

DB小提琴:

这个怎么样

SELECT
    l.code,
    l.location_name,
    SUM(p.amount)
FROM
    locations l
LEFT JOIN payments p 
ON p.location_code = l.code
GROUP by l.code,l.location_name
如果不希望更改分组依据,则可能必须使用子查询:

SELECT
    l.code,
    (select location_name from locations l2 where l.code=l2.code),
    SUM(p.amount)
FROM
    locations l
LEFT JOIN payments p 
ON p.location_code = l.code
GROUP by l.code
可以将
SUM()
放入相关子查询:

SELECT
    l.code,
    (select location_name from locations l2 where l.code=l2.code),
    SUM(p.amount)
FROM
    locations l
LEFT JOIN payments p 
ON p.location_code = l.code
GROUP by l.code


您还可以将
location.code
定义为表的主键(或将其声明为唯一键)。然后,您可以按该列进行聚合并选择所有其他列:

SELECT l.*, SUM(p.amount)
FROM locations l LEFT JOIN
     payments p 
     ON p.location_code = l.code
GROUP BY l.code;
他是一把小提琴


这是SQL的标准行为;它基于一种称为“功能依赖性”的东西。

是的,将
l.location\u name
添加到GROUP BY列表中,注意
l.location.name!=l、 位置\u名称
。请参阅:@cyberfly如果将
location\u name
添加到group by中会产生不同的值,则
code
可以有多个
location\u name
。但是您想要一个
code
和一个
location\u name
。那么应该显示哪个
location\u name
?你可能会得到其中任何一个,这有什么用?@BarbarosÖzhan实际上这是我想要查询的真实表的更简单版本。让我们看看,如果将来我想选择更多的列,那么继续将列添加到组中是没有意义的,这样会导致不同的结果。这将带来不想要的结果,例如,如果我需要选择更多的列,我将使用子查询修改答案。希望有帮助。@TomYeh子查询需要限制1,否则它几乎肯定会返回多个结果并引发异常。你说得对。基本上,这取决于你的要求,在where子句中加入更多的限制条件,以获得你想要的条件。感谢好消息,难怪我尝试使用主键加入,没有问题。我将投票表决你的答案,因为我无法将表结构的替代视图更改为我要解决的问题。通过这种方式,一切都会变得更容易,例如想要对记录进行分页感谢接受,请不要忘记向上投票。我将不胜感激:)