[英]mysql if inside select with aggregate functions
我有一個庫存表,其中列出了多個位置的數量。 我保留數量值,現在必須保留“閾值”值,當達到閾值時,停止銷售產品。 這只是一個虛假的因素,因此當人們的庫存不准確時,會有一點緩沖來確保他們不會過度承諾銷售。
SELECT product, sum(quantity) as pooled, max(quantity) as maxincart FROM `inventory` WHERE location=1 OR location=2 OR location=3 GROUP by product
我嘗試過的查詢的主要問題是它們匯總了我所有的位置。 在達到閾值之前還不錯。 現在,我寧願忽略的位置也包括在我的總和中,我希望通過IF將其從聚合函數中刪除。
Sometimes it works fine.
locationA has 7 and a threshold of 3.
locationB has 9 and a threshold of 4.
總結一下,結果是16-7 = 9很好!
But then there are situations like this
locationA has 7 and a threshold of 3.
locationB has 0 and a threshold of 4.
總共加起來,它是7-7 =0。LocationA想要出售他們的4,但現在不能。
有沒有一種方法可以將if嵌套在查詢中,以便當位置的qty-threshold <= 0時將其從總和中排除? 我試圖在mysql中做到這一點,以使其保持快速運行,找到了一些有關在select中使用的好信息,但是將其與group by和聚合函數結合起來使我陷入困境。
我正在查詢的表是一個中間表,可以進行重組。 因此,我願意接受有關更改表格以使其工作的想法。 我只是想讓它快速,所以我不想在每個產品中都進行另一個查詢。 我已經考慮過通過以下方式消除分組:按產品排序,將值存儲在數組中,以及當產品更改時使用此邏輯在數組中運行時……但這也意味着更大的循環和更多的內存使用。 我希望有一些mysql天才可以幫上忙。 謝謝!
我發現很難解決該問題,但是我認為您的解決方案是按位置(位置/產品?)進行預匯總,然后再次進行匯總。 像這樣:
SELECT product,
sum(greatest(quantity - threshhold, 0))
FROM (SELECT location, product, sum(quantity) as quantity, max(threshhold) as threshhold
FROM `inventory`
WHERE location IN (1, 2, 3)
GROUP by location, product
) lp
GROUP BY product;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.