我有一张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计算时,如何处理缺失的条目?
答案 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;