集計したくない値を削除するのは非常に簡単です。
例えば:
_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;
のみを含めていました。合計からアイテムを除外することに実際には興味がないので、返された結果だけです!混乱にもかかわらず、ありがとう!
あなたが持っている質問は、あなたが質問で表現したことではなく、あなたが望むことを実際に行っています。 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
_
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
合計を一時テーブルに選択し、次に一時テーブルから選択することにより、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