2011-03-31 62 views
1

在涉及聚集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 
) 

...但这个失败,错误Operand should contain 1 column(s)因为子查询选择id(我想要的)和总数(我不这样做)。我能以任何方式从子查询结果中排除total吗?

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

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

回答

3

您的查询应该是这样的:

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

你需要把聚合函数在having子句和子查询,你需要你的where子句中选择相同的列#。

+0

谢谢!我不知道我在哪里“有”只能使用选定列的想法:\ – 2011-03-31 03:39:36

1
WHERE idclient IN (...) 

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

可以省略由总列:

SELECT idclient 
FROM payment 
GROUP BY idclient 
HAVING SUM(amount) > 100 
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