У меня есть такая таблица:
и мне нужно отобразить доступное количество для product_id = 1 AND GROUP per-pallet_id. Формула проста, суммируйте действие «ДОБАВИТЬ» — «УДАЛИТЬ» для каждого поддона_id, поэтому результат должен быть таким:
Что я сделал:
SELECT ((SELECT sum(DISTINCT qty) as ADDING FROM table WHERE action IN ('ADD') AND product_id IN (1)) - ifnull((SELECT sum(DISTINCT qty) as REMOVING FROM table WHERE action IN ('REMOVE') AND product_id IN (1)),0)) as avaiable_qty, pallet_id FROM table WHERE product_id IN (1) GROUP BY pallet_id ORDER BY product_id DESC
Тогда результат будет одинаковым для этих двух строк: доступное количество равно 120 в каждой. Поэтому я считаю, что должен добавить «GROUP BY». Я добавил, стало так:
SELECT ((SELECT sum(DISTINCT qty) as ADDING FROM table WHERE action IN ('ADD') AND product_id IN (1) GROUP BY pallet_id) - ifnull((SELECT sum(DISTINCT qty) as REMOVING FROM table WHERE action IN ('REMOVE') AND product_id IN (1) GROUP BY pallet_id),0)) as avaiable_qty, pallet_id FROM table WHERE product_id IN (1) GROUP BY pallet_id ORDER BY product_id DESC
Но MySQL возвращается #1242 subquery returns more than 1 row
Пытался искать в google, но не нашел похожего случая с похожей структурой таблицы. Я действительно ценю твою помощь.
Используйте условную агрегацию:
SELECT pallet_id,
SUM(qty * CASE action WHEN 'ADD' THEN 1 WHEN 'REMOVE' THEN -1 END) AS available_qty
FROM tablename
WHERE product_id IN (1) -- or product_id = 1
GROUP BY pallet_id;
Ууууууу!!! Ваш запрос такой простой и правильный, как то, что мне нужно! Большое спасибо @forpas