2015-02-23 119 views
0

我正在做一些關於NORTHWND db的基本練習。我想執行以下代碼:選擇記錄值<avg() - 不正確的結果

SELECT   
    sum(SaleAmount) AS SaleAmount 
    , CompanyName 

FROM  [Sales Totals by Amount] 

where [SaleAmount] > 
(
     Select 
     avg(SaleAmount) as SaleAmount 
     from [Sales Totals by Amount] 
) 
group by CompanyName 

平均值等於4409,4948。當我試圖讓值大於平均值時,結果是正確的。當我試圖讓值低於平均值時,它會返回低於平均值和高於平均值的值。 如果您指出我的錯誤在哪裏,我將不勝感激。

+2

你知道'WHERE SaleAmount>'使用的是基列,而不是'SUM(SaleAmount)',對嗎?您可以通過爲表達式使用更好的別名來避免這種歧義,例如'TotalSaleAmount'。 – 2015-02-23 20:24:42

+0

它正在返回'sum(SaleAmount)'。該數量取決於應用「where」過濾器後數據中的行數。 – 2015-02-23 20:25:02

+0

您是否試圖獲得'SaleAmount'的值的總和?*個體值*大於平均值,或者總和大於平均值? – 2015-02-23 21:26:07

回答

1

要將過濾器應用到一個聚合公式使用HAVING關鍵字:

SELECT   
    SUM(SaleAmount) AS SaleAmount, 
    CompanyName 
FROM  [Sales Totals by Amount] 
GROUP BY CompanyName 
HAVING sum(SaleAmount) > 
(
     Select 
     AVG(SaleAmount) as SaleAmount 
     FROM [Sales Totals by Amount] 
) 
+0

謝謝!這個解決方案很簡單,效果很好! – 2015-02-23 20:42:18

+0

我不確定它會返回正確的結果。 SUM()是什麼意思是大於銷售的平均水平? – 2015-02-23 21:20:35

0

你也可以用一個CTE解決這個問題:

;WITH TotalSalesByCompany AS (
    SELECT SUM(SaleAmount) AS TotalSaleAmount, 
      CompanyName 
     FROM [Sales Totals by Amount] 
    GROUP BY CompanyName 
) 
SELECT * 
    FROM TotalSalesByCompany 
WHERE [TotalSalesAmount] > 
     (SELECT AVG(SalesAmount) AS AverageSales FROM [Sales Totals By Amount]) 

的CTE由公司生產總量的列表,並且SELECT子句選擇總銷售額大於平均水平的每個公司。