2016-02-16 2 views
0

У меня есть следующие функции, MySQL запрос:неправильный результат MySQL в функции только

BEGIN 
DECLARE r float(10,2); 
DECLARE var_total float(10,2); 
DECLARE var_discount float(10,2) DEFAULT null; 


SELECT 
    sum(x.amount) 
    FROM 
(
    (SELECT 
     student_booking_school_course_price as amount 
    FROM 
     tbl_student_booking_school_course 
    WHERE 
     student_booking_id=par_student_booking_id 
    ) 
    UNION 
    (SELECT 
     student_booking_school_accommodation_price as amount 
    FROM 
     tbl_student_booking_school_accommodation 
    WHERE 
     student_booking_id=par_student_booking_id 
    ) 
    UNION 
    (SELECT 
     student_booking_school_insurance_price as amount 
    FROM 
     tbl_student_booking_school_insurance 
    WHERE 
     student_booking_id=par_student_booking_id 
    ) 
    UNION 
    (SELECT 
     student_booking_school_transfer_price as amount 
    FROM 
     tbl_student_booking_school_transfer 
    WHERE 
     student_booking_id=par_student_booking_id 
    ) 
) x 

INTO var_total; 

IF var_total IS NULL THEN 
    SET r = 0; 
END IF; 

-- discount 
SET var_discount = (SELECT 
    sb.student_booking_discount_amount 
FROM 
    tbl_student_booking sb 
WHERE 
    sb.student_booking_id=par_student_booking_id LIMIT 1); 

IF var_discount IS NOT NULL THEN 
    SET r = var_total - var_discount; 
end if; 


return r; 

END 

Значения: 9698,88 курс 559,55 проживание 559,55 страхование 145,98 скидка

Похоже, что первый запрос внутри функции, суммирует только разные значения, в результате с дисконтом: 10112.45, поэтому не суммируя одно значение 559.55, я пытался выводить разные вещи как concat со строкой и видеть результат только как 9698.88курс, 559.55accommodation , и т.д .. и это Это хорошо. Поэтому я предполагаю, что проблема заключается не в суммировании, если значения равны. Странная вещь заключается в том, что запуск этого с консоли, только запрос вне функции, он суммирует нормально.

Мой вопрос - это нормальное поведение MySql? Если да, то есть способ предотвратить это? это ошибка?

ответ

1

Что вам нужно здесь UNION ALL пункт:

SELECT 
sum(x.amount) 
FROM 
(
(SELECT 
    student_booking_school_course_price as amount 
FROM 
    tbl_student_booking_school_course 
WHERE 
    student_booking_id=par_student_booking_id 
) 
UNION ALL 
(SELECT 
    student_booking_school_accommodation_price as amount 
FROM 
    tbl_student_booking_school_accommodation 
WHERE 
    student_booking_id=par_student_booking_id 
) 
UNION ALL 
(SELECT 
    student_booking_school_insurance_price as amount 
FROM 
    tbl_student_booking_school_insurance 
WHERE 
    student_booking_id=par_student_booking_id 
) 
UNION ALL 
(SELECT 
    student_booking_school_transfer_price as amount 
FROM 
    tbl_student_booking_school_transfer 
WHERE 
    student_booking_id=par_student_booking_id 
) 
) x 

INTO var_total; 

для MySQL UNION Документация говорит:

Отчетливый объединение может быть получено в явном виде с помощью UNION DISTINCT или неявно не используя UNION с не после ключевого слова DISTINCT или ALL.

+0

Я этого не знал! действительно полезная информация! – peterpeterson

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