在计算SQL中的平均值时将缺失对处理为零

时间:2016-03-24 15:14:37

标签: sql aggregate missing-data

我有一张POS交易数据表,我试图汇总一些购买信息。样本可能看起来像

inpt1=open("grades.csv","r")
outpt1=open("examscores.csv","w")
studentname=[]
studentlastname=[]
gradeav=[]
highav=0
inpt1.readline()

for line in inpt1:
   data=line.split(",")
   averages=math.ceil(data[2])+float(data[3])/2
   studentname.append(data[0])
   studentlastname.append(data[1])
   gradeav.append(averages)
inpt1.close()
outpt1.close()

我的目标是计算按类别分组的平均每日销售额。我的问题是每天的销售条目数量不一致,所以我需要在汇总之前获得每个类别的每日总和。

对于这个例子,我的目标是产生每日平均值的查询,按代码分组:

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

但是,因为并非所有日子都有所有类别的销售额,计算每个类别的每日总金额并取平均值不会起作用:查询

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;

这省略了这样一个事实,即在04年11月,没有进行电子销售,这意味着每天的平均销售额更高。

使用AVG计算时,如何处理缺失的条目?

1 个答案:

答案 0 :(得分: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;