2016-03-24 4 views
1

私はPOSトランザクションデータのテーブルを持っており、購入情報の一部を集計しようとしています。サンプルは次のようになりますSQLで平均を計算するときに欠損ペアをゼロとして処理する

pID (int) | pDate (varchar) | pAmount(numeric) | pCode(varchar) 
1   | 01-NOV-14  | 12.67   | ELECTRONIC 
2   | 01-NOV-14  | 61.89   | HOUSEWARE 
3   | 01-NOV-14  | 52.25   | ELECTRONIC 
4   | 02-NOV-14  | 9.12    | HOUSEWARE 
5   | 02-NOV-14  | 17.11   | ELECTRONIC 
6   | 03-NOV-14  | 39.88   | HOUSEWARE 
7   | 03-NOV-14  | 21.60   | ELECTRONIC 
8   | 03-NOV-14  | 16.78   | HOUSEWARE 
9   | 04-NOV-14  | 47.29   | HOUSEWARE 

私の目標は、カテゴリごとにグループ化された平均日々の販売額を計算することです。私の問題は、1日あたりの売上数が一定しないため、集計する前に各カテゴリの1日合計を取得する必要があるということです。

この例では、私の目標は、コードによってグループ化された日の平均を生成し、クエリ、次のようになりますないすべての日は、カテゴリごとに毎日合計を計算する、すべてのカテゴリの売上を持っているので、

SalesItem | AverageDailySales 
ELECTRONIC | 25.91 
HOUSEWARE | 43.74 

しかし、と平均をとることは動作しません。クエリを

SELECT s.pCode AS SalesItem, TO_CHAR(AVG(s.TotalDaySales), '999.99') AS AverageDailySales 
FROM (SELECT t.pDate, t.pCode, SUM(t.pAmount) as TotalDaySales 
     FROM Pos_Transactions t 
     GROUP BY t.pDate, t.pCode) s 
GROUP BY s.pCode ORDER BY s.pCode; 

利回り

SalesItem | AverageDailySales 
ELECTRONIC | 34.54 
HOUSEWARE | 43.74 

は、11月4日に電子販売が行われておらず、1日あたりの平均販売高が高いことを意味していません。

AVGを使用して計算する際に、不足している項目をどのように処理できますか?

答えて

1

一つのアプローチは、AVGを使用するのではなく、部門を自分でやることではない。

SELECT t.pCode, 
     TO_CHAR(SUM(t.pAmount) 
       /(SELECT COUNT(DISTINCT t2.pDate) FROM Pos_Transactions t2), 
       '999.99') 
     as AverageDailySales 
    FROM Pos_Transactions t 
GROUP BY t.pCode 
ORDER BY t.pCode; 
+0

パーフェクト - (GROUP BYがかかっも優先)VKPの答えと問題固定ネストされたクエリとは別個の呼び出し – user2093082