开发者

Select grouped by column only, not the aggregate

In a MySql select statement involving aggregation, is it possible to select just the grouped by column without the aggregate?

Basically I want to select IDs in subquery according to a criteria based on an aggregate, in this case the total payments to a client:

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

... but this fails with error Oper开发者_如何学Goand should contain 1 column(s) because the subquery selects both the id (which I want) and the total (which I don't). Can I exclude total from the subquery result in any way?

Edit: if possible I would prefer to avoid using a join - the where clause is being passed onto another existing function on its own.

Apologies if this is a dupe - I did search, honest. I couldn't find an exact answer in the mass of SQL aggregate questions.


Your query should be like this:

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

You need to put aggregate function in having clause and in sub query you need to select # of columns same as in your where clause.


WHERE idclient IN (...)

The stuff inside (...) is a subquery. Obviously it should only return one column, because you only need one column of data for the IN clause.

You can omit the total column by:

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


You could also try this one:

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

And, because the client.idclient column looks very much like a PK, you could probably even omit client.business_name from GROUP BY. So the final query would look like this:

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
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜