簡體   English   中英

分組依據和具有子句說明

[英]Group By and Having Clause description

我試圖弄清楚這段代碼是怎么回事:

SELECT EMP_ID, SUM(INV_PRICE) AS TOTAL_SALES
FROM INVOICE
GROUP BY EMP_ID
HAVING SUM(INV_PRICE) <= AVG(INV_PRICE);

我寫了它,或者它被推薦在一段時間前,現在我不確定它是否在做我最初想要它做的事情。

我想要的是:我有一張包含價格和員工的發票表。 我想獲得每個員工的總銷售額,並將其與所有員工的平均總銷售額進行比較。 從那里我希望結果顯示哪些員工的銷售額低於平均水平。

我上面的說法正確嗎?

這是我運行 <= average 時得到的結果:

在此處輸入圖片說明

這是我跑 > 平均時得到的結果:

在此處輸入圖片說明

我認為我主要關心的是確保它計算出正確的平均值。 這是每個員工總和的平均值。

我上面的說法正確嗎?

不。您的查詢可能沒有返回任何記錄(僅返回有一次銷售的記錄)。 大多數情況下,sum(inv_price) 大於或等於任何給定組的 avg(inv_price)。

您想在另一個查詢中預先計算平均值。

你想要的是這個:

SELECT EMP_ID, SUM(INV_PRICE) AS TOTAL_SALES
FROM INVOICE
GROUP BY EMP_ID
HAVING SUM(INV_PRICE) <= (
    SELECT AVG(INV_SUM)
    FROM (
        SELECT SUM(INV_PRICE) AS INV_SUM
        FROM INVOICE
        GROUP BY EMP_ID) x) ;

這里計算的平均值是針對所有員工的,而你是針對每個組計算的,這是沒有意義的:總和不能超過任何給定組的平均值。

不,這不對。 SUM(INV_PRICE)會給你一個員工的總銷售額,但AVG(INV_PRICE)會給你每個員工的平均銷售額,而不是他們總銷售額的平均值(對於所有員工)。

試試這個,你想計算所有員工的總銷售額的平均值——即使是那些根本沒有銷售額的員工:

SELECT EMP_ID, SUM(INV_PRICE) AS TOTAL_SALES
FROM INVOICE
GROUP BY EMP_ID
HAVING SUM(INV_PRICE) <= 
         ( SELECT SUM(INV_PRICE) FROM INVOICE )
       / ( SELECT COUNT(*) FROM EMPLOYEE )
  ; 

或者如果你想要所有有銷售額的員工的平均值:

SELECT EMP_ID, SUM(INV_PRICE) AS TOTAL_SALES
FROM INVOICE
GROUP BY EMP_ID
HAVING SUM(INV_PRICE) <= 
         ( SELECT SUM(INV_PRICE) / COUNT(DISTINCT EMP_ID) 
           FROM INVOICE )
  ; 

跳過那個,Access 沒有COUNT(DISTINCT )

SELECT EMP_ID, SUM(INV_PRICE) AS TOTAL_SALES
FROM INVOICE
GROUP BY EMP_ID
HAVING SUM(INV_PRICE) <=
         ( SELECT AVG(TOTAL_SALES)
           FROM
             ( SELECT SUM(INV_PRICE) AS TOTAL_SALES
               FROM INVOICE
               GROUP BY EMP_ID 
             ) tmp
         ) ; 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM