选择仅按列分组,而不是聚合

时间:2011-03-31 03:15:44

标签: mysql sql subquery aggregate-functions

在涉及聚合的MySql select语句中,是否可以选择列分组而不聚合?

基本上我想根据基于聚合的标准在子查询中选择ID,在这种情况下是对客户的总付款:

select idclient, business_name from client where idclient in
(
  select idclient, sum(amount) as total 
  from payment 
  group by idclient
  having total > 100
)

...但由于子查询选择了id(我想要的)和总数(我没有),因此失败并出现错误Operand should contain 1 column(s)。我可以以任何方式从子查询结果中排除total吗?

编辑:如果可能的话我宁愿避免使用连接 - 将where子句传递给另一个现有的函数。

道歉,如果这是一个骗局 - 我做了搜索,诚实。我无法在大量的SQL聚合问题中找到确切的答案。

3 个答案:

答案 0 :(得分:3)

您的查询应该是这样的:

select idclient, business_name from client where idclient in
(
  select idclient 
  from payment 
  group by idclient
  having sum(amount) > 100
)

你需要将聚合函数放在having子句中,在子查询中你需要选择与where子句相同的列数。

答案 1 :(得分:1)

WHERE idclient IN (...)

(...)内的内容是子查询。显然它应该只返回一列,因为IN子句只需要一列数据。

您可以通过以下方式省略总列数:

SELECT idclient
FROM payment
GROUP BY idclient
HAVING SUM(amount) > 100

答案 2 :(得分:0)

你也可以尝试这个:

SELECT c.idclient, c.business_name
FROM payment p
  INNER JOIN client c ON c.idclient = p.idclient
GROUP BY c.idclient, c.business_name
HAVING SUM(p.amount) > 100

而且,因为client.idclient列看起来非常像PK,所以你甚至可以省略GROUP BY中的client.business_name。所以最终的查询看起来像这样:

SELECT c.idclient, c.business_name
FROM payment p
  INNER JOIN client c ON c.idclient = p.idclient
GROUP BY c.idclient
HAVING SUM(p.amount) > 100