1

私はこのコードが何をしているのか理解しようとしています:

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

私はそれを書いたか、少し前にすることをお勧めしましたが、今はそれが私が最初にやりたかったことをしているのかどうかわかりません。

欲しいもの:価格と従業員が記載された請求書テーブルがあります。各従業員の総売上高を取得し、それを全従業員の平均総売上高と比較したかったのです。そこから、どの従業員が平均を下回って販売しているかを結果に示したいと思いました。

私が上に持っているものは正しいですか?

<=averageを実行すると次のようになります。

ここに画像の説明を入力してください

>平均を実行すると次のようになります。

ここに画像の説明を入力してください

私の主な関心事は、それが正しい平均を計算していることを確認することだと思います。これは、各従業員の合計の平均です。

4

3 に答える 3

3

私が上に持っているものは正しいですか?

いいえ。クエリはおそらくレコードを返していません(1回の販売のレコードのみ)。sum(inv_price)は、ほとんどの場合、任意のグループのavg(inv_price)以上です。

別のクエリで平均を事前計算したいとします。

于 2012-11-25T23:25:59.200 に答える
2

あなたが欲しいのはこれです:

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) ;

ここで計算された平均はすべての従業員について計算されますが、各グループについて計算されます。これは無意味です。合計は、特定のグループの平均を超えることはできません。

于 2012-11-25T23:30:47.973 に答える
1

いいえ、ちがいます。はSUM(INV_PRICE)、従業員の総売上高を示しますが、総売上高のAVG(INV_PRICE)平均(すべての従業員)ではなく、従業員1人あたりの平均売上高を示します。

これを試してみてください。売上がまったくない従業員も含めて、すべての従業員の総売上の平均を計算します。

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
         ) ; 
于 2012-11-25T23:35:14.970 に答える