Postgresql

使用空值解決平均行為

  • December 5, 2019

我有兩張桌子:

  • 產品(PK product_id、品牌、型號)
  • 訂單(PK invoice_id、customer_name、customer_email、FK product_id)

我正在嘗試查找產品銷售次數最接近產品平均銷售次數的產品。

問題是據我所知,該AVG函式在計算平均值時會忽略 NULL 值。所以如果一個產品以前從未銷售過,它不會被包括在平均值中,但它應該被包括在內,以便我的計算是正確的。空值應計為零以降低平均值。

我該如何解決這個問題?

NULL在計算平均值時像 0 一樣計數,請使用

avg(coalesce(colname, 0))

coalesce將返回它的第一個不是的參數NULL

您將需要一個外部聯接,以便將沒有訂單的產品也計算在內。

您可以使用視窗函式計算同一語句中的平均值。

類似的東西:

select *, (num_orders / average_orders) * 100 as pct
from (  
 select p.product_id, 
        count(o.invoice_id) as num_orders,
        avg(count(o.invoice_id)) over () as average_orders
 from product p
   left join "Order" o on o.product_id = p.product_id
 group by p.product_id
) t

count(o.invoice_id)對於沒有訂單的產品將產生 0,因為空值被忽略,並且這些產品的 invoice_id 將為空(因為不存在訂單)

然後,您可以按百分比排序以找到最接近平均值的百分比。

引用自:https://dba.stackexchange.com/questions/254869