簡體   English   中英

mysql如果在內部選擇聚合函數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM