在 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;
我有一个 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;