mysql如果在内部选择聚合函数

时间:2015-04-28 15:37:15

标签: mysql sql performance if-statement 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和aggregate函数相结合让我陷入困境。

我查询的表是一个中间表,可以进行重组。因此,我对改变表格以使其有效的想法持开放态度。我只是希望它很快,所以我不想在每个产品中进行另一个查询。我考虑过消除群组,按产品排序,将值存储在数组中,以及当产品使用此逻辑更改在阵列中运行时...但这也意味着更大的循环和更多的内存使用。我希望有一些mysql天才可以伸出援助之手。谢谢!

1 个答案:

答案 0 :(得分:3)

我发现很难解决这个问题,但我认为您的解决方案是按位置(位置/产品?)进行预聚合,然后再次聚合。像这样:

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;