在 SQL 中计算平均值时将缺失对视为零

Treating missing pairs as zero when calculating an average in SQL

我有一个 table 的 POS 交易数据,我正在尝试汇总我们的一些购买信息。样本可能看起来像

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;

产量

SalesItem  | AverageDailySales
ELECTRONIC | 34.54
HOUSEWARE  | 43.74

这忽略了一个事实,即 11 月 4 日没有进行任何电子销售,这意味着每天的平均销售额更高。

AVG计算时漏项如何处理?

一种方法是不使用 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;