2011-03-31 22 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