2013-04-02 38 views
4

刪除不想彙總的值非常容易。SQL:聚合後如何過濾?

例如:

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

這將排除所有的銷售與求和聚集的值小於1000。

但是如何過濾聚合之後?

E.g. WHERE ("Total sales"> 15000)

編輯:具有諷刺意味的是我只包括HAVING SUM(sales) > 1000;爲了防止混淆所需的查詢類型;因爲我實際上並不希望從總結中排除項目,只是返回的結果!謝謝,儘管混亂!

+0

你能給樣本記錄嗎?你的問題很簡單,但你的陳述很混亂。 –

+2

不理解你的問題。你已經在做你所要求的。你查詢過濾所有的聚合數小於1000的聚集。你能改述嗎? –

+0

改寫:對返回值進行過濾。該查詢將排除小於X的結果。可能是更有效的方法來處理它,因爲計算隨後被排除在外似乎有點浪費。 – Stumbler

回答

9

您的查詢實際上是在做你想做的事情,而不是你在問題中表達的內容。如果您希望排除價值小於1000的所有銷售,則應使用WHERE sales > 1000。但與HAVING SUM(sales) > 1000過濾實際上是在聚合後完成的。

在原始查詢的頂部寫入子查詢並添加另一個SELECT WHERE是多餘的。

澄清請參閱fiddle

#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 
1

您可以通過選擇和到一個臨時表,然後從臨時表中選擇做一個過程分爲兩個步驟:

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 
+2

這恰恰是不應該做的一個例子。在第一個查詢中將1000替換爲15000,並得到相同的結果。 – jurgenreza

+1

@jurgenreza當然,你是對的,它是一個冗餘過濾器。雖然我回答了他的問題(有些[XY問題](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem))。儘管如此,根據他的描述,他可能打算在他的實際查詢中通過不同的字段進行過濾,並且這種方法對此會起作用。 – techturtle

2

如果你想和值小於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