2015-04-28 6 views
0

У меня есть таблица инвентаря, в которой перечислены количества в нескольких местах. Я сохраняю значение количества, и теперь мне нужно сохранить «пороговое» значение, и когда я дойду до порога, прекратите продавать продукт. Это просто фактор выдумки, поэтому, когда у людей есть неточные запасы, есть небольшой буфер, чтобы убедиться, что они не совершают продажи.mysql if внутри select с агрегатными функциями

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. 

Sum все это, и это 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. 

Sum все это, и это 7 - 7 = их 4, но не может теперь 0. LocationA хочет продать.

Есть ли способ вложить внутри, если внутри запроса, так что когда qty-порог местоположения < = 0, то он будет исключен из суммы? Я пытаюсь сделать это в mysql, чтобы сохранить его быстро, нашел хорошую информацию об использовании в select, но объединив его с группой и функциями агрегата, я застрял.

Таблица, которую я запрашиваю, является промежуточной таблицей и может быть изменена. Поэтому я открыт для идей об изменении таблицы, чтобы заставить ее работать. Я просто хочу, чтобы это было быстро, поэтому я не хочу делать другой запрос внутри каждого продукта. Я решил удалить группу, упорядочиваясь по продукту, сохраняя значения в массиве, и когда продукт изменяется через массив с помощью этой логики ... но это также означает гораздо больший цикл и больше используемой памяти. Я надеюсь, что какой-то гений mysql там может протянуть руку и помочь. Благодаря!

+2

Можете ли вы предоставить образцы данных и желаемые результаты? Ваша логика не имеет полного смысла. Что такое «7»? Кроме того, отношения между вашим примером и запросом отсутствуют. , , в запросе указаны «1», «2», «3», но «a» и «b» в описании. –

+0

qty-threshold - это то, что у них есть для продажи. Таким образом, в первом примере это (7 + 9) - (3 + 4) = 9 во втором примере это (7 + 0) - (3 + 4) = 0 и мне хотелось бы игнорировать locationB, чтобы оно было (7) - (3) = 4. – RightClick

+0

Извините, я подумал, что читать примеры проще, используя буквы вокруг чисел. В действительности местоположения являются varchars и могут быть названы 345OFFSITE2. Они не будут жестко закодированы в запросе, они поступают из другой таблицы. Извините, если непоследовательность запутывает, это не моя проблема, просто для контекста. – RightClick

ответ

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; 
+0

есть тот гений mysql, на который я надеялся. Кажется, что это на правильном пути. Я дам ему попробовать и вернусь к наградам, спасибо за это! – RightClick

+0

Да, вот и все. Мне понадобилось некоторое ifs в моем внутреннем групповом элементе, чтобы справиться с проблемной ситуацией, и, как я упоминал, места были получены из другой таблицы. Но группировка группировки была подталкиванием в правильном направлении, в котором я нуждался. Благодаря! – RightClick

Смежные вопросы