Сумма MySQL на основе комплексной скидки

Я изо всех сил пытаюсь решить следующую проблему. У меня 3 таблицы, idp | продукт | qMin | discount_class | pallet_class_id_int 1 продукт 1 10 1 2 2 product 2 5 1 0 , sh_discount_class и discount_id | название | описание | discount_value 1 5 % 5 % налог 0.05, как указано ниже:

sh_product:

id  | sh_id  |  idp  | quantity  | value
1     49        1      10          120
2     49        2      1           240 

sh_discount_class

quantity

sh_shipping_lines

sh_shipping_lines

В принципе, я хотел бы суммировать все значения на основе следующих критериев:

  1. всякий раз, когда qMinот товара sh_shipping_linesбольше, чем sh_productот продукта, от sh_productсоответствующего скидки от sh_discount_class

  2. всякий раз, когда продукт из pallet_class_id_intобъявленного означает, что конкретный продукт вдвое больше, чем idpсоответствующий pallet_class_id_int. На самом деле pallet_class_id_intпредставляют idpдругой продукт из таблицы

Итак, в моем случае общая сумма должна быть (1440 - 5%) = 1368
Я попытался работать со следующим выбором, но все же он не вычисляет общую стоимость, как это должно быть

SELECT DISTINCT sh_shipping_lines.idp, sh_discount_class.discount_value, sh_discount_class.description, 
                          SUM(sh_shipping_lines.quantity) as total, sh_product.qMin, 
                          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              product 1      10        10      1140
2      0.05              product 2      1         5        228   

mysql,

-1

Ответов: 1


1 принят

Добавлено небольшое исправление в ваш запрос (с помощью 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;
MySQL,
Похожие вопросы