[英]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.