【问题标题】:Treating missing pairs as zero when calculating an average in SQL在 SQL 中计算平均值时将缺失对视为零
【发布时间】:2016-07-12 05:56:42
【问题描述】:

我有一个 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 计算时如何处理丢失的条目?

【问题讨论】:

    标签: sql aggregate missing-data


    【解决方案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;
    

    【讨论】:

    • 完美 - 与嵌套查询不同的调用解决了 vkp 答案的问题(其中 group by 优先)
    猜你喜欢
    • 1970-01-01
    • 2021-10-14
    • 2021-02-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多