2011-03-31 23 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を除外できますか?

編集:可能であれば、joinを使用しない方がいいです。where句は、別の既存の関数に渡されます。

これが詐欺であれば謝罪する - 私は正直な検索をした。私は、SQL集約質問の大部分で正確な答えを見つけることができませんでした。

答えて

3

あなたのクエリは次のようにする必要があります:

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

あなたは、あなたのwhere句で同じ列の#を選択する必要が句を持つにしてサブクエリで集計機能を配置する必要があります。

+0

ありがとうございます!私は、「持っている」という選択肢が選択された列しか使用できないという考えをどこで得たのか分かりません:\ –

1
WHERE idclient IN (...) 

(...)はサブクエリです。明らかに、IN句には1列のデータしか必要ないので、1つの列しか返さないはずです。

あなたが総列を省略することができます:あなたはこの1試みることができる

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 
関連する問題