Postgresql
使用空值解決平均行為
我有兩張桌子:
- 產品(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 將為空(因為不存在訂單)然後,您可以按百分比排序以找到最接近平均值的百分比。