web-dev-qa-db-ja.com

SQL:集計後にフィルタリングする方法は?

集計したくない値を削除するのは非常に簡単です。

例えば:

_SELECT department, SUM(sales) as "Total sales"
FROM order_details
GROUP BY department
HAVING SUM(sales) > 1000;
_

これにより、値が1000以下のすべての売上が合計集計から除外されます。

しかし、集計後にどのようにフィルタリングしますか?

例えば。 WHERE ("Total sales"> 15000)

編集:皮肉なことに、必要なクエリの種類に関する混乱を防ぐために、HAVING SUM(sales) > 1000;のみを含めていました。合計からアイテムを除外することに実際には興味がないので、返された結果だけです!混乱にもかかわらず、ありがとう!

14
Stumbler

あなたが持っている質問は、あなたが質問で表現したことではなく、あなたが望むことを実際に行っています。 1000未満の値を持つすべての売上を除外する場合は、_WHERE sales > 1000_を使用する必要があります。しかし、HAVING SUM(sales) > 1000を使用すると、フィルタリングは実際には集計後に行われます。

サブクエリを作成し、元のクエリの上に別の_SELECT WHERE_を追加することは冗長です。

詳細については、 フィドル を参照してください。

_#Query1

SELECT department, SUM(sales) as Total
FROM order_details
GROUP BY department
HAVING Total > 40;

#Query 2

SELECT department, SUM(sales) as Total
FROM order_details
GROUP BY department
HAVING  SUM(sales) > 40;

#Query 3

SELECT department, SUM(sales) as Total
FROM order_details
WHERE sales > 40
GROUP BY department;

#Query 1 and 2 are the same, filtering after aggregation
#Query 3 is filtering before aggregation
_
17
jurgenreza

1000未満の値で販売をフィルタリングする場合、適切なクエリは次のとおりです。

SELECT department, sales
FROM order_details
WHERE sales > 1000

集計し、合計のみを15000以上に維持する場合は、次のクエリが必要です。

SELECT department, SUM(sales) as TotalSales
FROM order_details
WHERE sales > 1000
GROUP BY department
HAVING SUM(sales) > 15000
3
Cyril Gandon

合計を一時テーブルに選択し、次に一時テーブルから選択することにより、2段階のプロセスとして実行できます。

SELECT department, SUM(sales) as TotalSales
INTO #temp
FROM order_details
GROUP BY department
HAVING SUM(sales) > 1000

SELECT department, TotalSales
FROM #temp
WHERE TotalSales > 15000

DROP TABLE #temp
0
techturtle