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子句中加入更多的限制条件,以获得你想要的条件。感谢好消息,难怪我尝试使用主键加入,没有问题。我将投票表决你的答案,因为我无法将表结构的替代视图更改为我要解决的问题。通过这种方式,一切都会变得更容易,例如想要对记录进行分页感谢接受,请不要忘记向上投票。我将不胜感激:)