Добавлено небольшое исправление в ваш запрос (с помощью qMin и удалить DISTINCT - я не думаю, что вам это нужно). Я полагаю, что столбец qMin в sh_product - это минимальное количество данного продукта, которое вызывает скидку? Таким образом, IF должен быть:
sh_product.qMin <= SUM
И количество продукта с idp 2 равно 1 (как видно из таблицы sh_shipping_lines), так что поэтому скидка не срабатывает для второго продукта в sh_shipping_lines. Таким образом, IF правильный для продукта 1, но продукт 2 входит в ELSE, поэтому окончательная сумма составляет 1380.
SELECT sh_shipping_lines.idp, sh_discount_class.discount_value, sh_discount_class.description,
SUM(sh_shipping_lines.quantity) AS total, sh_product.qMin, SUM(sh_shipping_lines.quantity)*sh_shipping_lines.value*sh_discount_class.discount_value,
IF(sh_product.qMin>0 AND sh_product.qMin <= SUM(IF(sh_product.pallet_class_id_int>0, 2*sh_shipping_lines.quantity, sh_shipping_lines.quantity)),
SUM(sh_shipping_lines.quantity)*sh_shipping_lines.value - SUM(sh_shipping_lines.quantity)*sh_shipping_lines.value*sh_discount_class.discount_value,
SUM(sh_shipping_lines.quantity)*sh_shipping_lines.value
) AS val
FROM sh_shipping_lines
LEFT JOIN sh_product ON sh_product.idp = sh_shipping_lines.idp
LEFT JOIN sh_discount_class ON sh_discount_class.discount_id = sh_product.discount_class
WHERE sh_id=49
GROUP BY sh_shipping_lines.idp
Результатом этого запроса является:
idp discount_value description total qMin val
1 0.05 5% tax 10 10 1140.0000
2 0.05 5% tax 1 5 240.00
Возможно, эта обновленная версия должна работать . Это очень уродливо, но работает для данного ввода:
SELECT sh_shipping_lines.idp, sh_discount_class.discount_value, sh_discount_class.description,
SUM(sh_shipping_lines.quantity) AS total, sh_product.qMin, relatedQuantity,
IF(sh_product.qMin > 0 AND
(
sh_product.qMin <= sh_shipping_lines.quantity
OR
sh_product.qMin <= (IF(sh_product.pallet_class_id_int=0, relatedQuantity, sh_shipping_lines.quantity))
),
SUM(sh_shipping_lines.quantity)*sh_shipping_lines.value - SUM(sh_shipping_lines.quantity)*sh_shipping_lines.value*sh_discount_class.discount_value,
SUM(sh_shipping_lines.quantity)*sh_shipping_lines.value
) AS val
FROM sh_shipping_lines
LEFT JOIN sh_product ON sh_product.idp = sh_shipping_lines.idp
LEFT JOIN sh_discount_class ON sh_discount_class.discount_id = sh_product.discount_class
LEFT JOIN (
SELECT relatedResult.idp AS originalIdp, sh_shipping_lines.idp, sh_shipping_lines.quantity*2 AS relatedQuantity
FROM
(
SELECT sh_shipping_lines.*, prod.idp AS relatedIdp
FROM sh_product
JOIN sh_shipping_lines ON sh_shipping_lines.idp=sh_product.idp
LEFT JOIN
(SELECT idp, pallet_class_id_int FROM sh_product) AS prod ON prod.pallet_class_id_int=sh_product.idp
WHERE sh_shipping_lines.sh_id=49
) as relatedResult
LEFT JOIN sh_shipping_lines ON sh_shipping_lines.idp=relatedResult.relatedIdp
) AS result ON result.originalIdp=sh_shipping_lines.idp
WHERE sh_id=49
GROUP BY sh_shipping_lines.idp;