2017-06-12 6 views
1

私の問題の簡単な例として、なぜ私はこれを行えないのでしょうか?グループ化されたステートメントでWhere句を使用できないのはなぜですか?

select id_number, sum(revenue) 
from table A 
where sum(revenue)>1000 
group by id_number 

(場合、これは混乱を引き起こし、なぜ私だけでなく、収益に1000以上持って結果を返すことができますか?)

免責事項、私はSQLに幾分新しいですが、いずれかを見つけることができませんでしたこれに関するドキュメンテーション。

ありがとう、

+0

条件が集計されたデータの場合は、 'where'の代わりに' where'( 'group by 'の後)を使用する必要があります。 – trincot

+0

集計の前に個々の行をフィルタリングするには、 'where revenue> 1000'を使用できます。 –

+0

彼は彼のすべての製品の合計を望んでいるので、これはうまくいかないでしょう。したがって、彼が$ 999という5つの製品を持っていれば、合計は$ 1000以上になっていないので、合計は$ 0になります。 – SandPiper

答えて

1

これはSQLの仕様です。 WHEREを使用することによってソーステーブルをフィルタリングします。そして文の断片のシーケンスは書かれている通りです。これは、フィルタリングされたテーブルに適用されているSUMをフィルタリングすることを意味します。つまり、HAVING句を使用してすでにグループ化された結果に対してフィルタを使用する必要があります。

select id_number, sum(revenue) 
from table A  
group by id_number 
having sum(revenue) > 1000 
0

単純な答えは、WHERE句が集約句の前に評価されるためです。したがって、あなたはまだ存在しないものに基づいてフィルタリングしようとしています。しかし、その問題を最初に存在させることで解決できます。サブクエリを作成し、それから選択してください:

WITH RevenueTotals AS (SELECT id_number, sum(revenue) AS Rev_Total 
         FROM table A 
         GROUP BY id_number) 
SELECT id_number, Rev_Total 
FROM RevenueTotals 
WHERE Rev_Total > 1000 
関連する問題