2016-07-08 2 views
1

Я не MySQL Professinal, но мой запрос работает отличноКак сократить этот MySQL Query (colums часто использовать одни и те же SQL части ...)

SELECT r.id, 

    /* Total repurchase price per Ton 
    * (Quantitiy/t * repurchase price/dry) + Extra Costs 
    */ 
    (
    SUM((rc.menge/1000) * (rw.preis/(IF (rw.is_zement = 1, 1.25 , 1))/(1 - (IFNULL(rw.h2o, 0)/100)))) + 
    SUM((rc.menge/1000) * pr.preis) + 
    IF ((r.extra_1_type > 0), IF ((r.extra_1_type = 1), extra_1 , extra_1 * SUM(rc.menge/1000)) , 0) + 
    IF ((r.extra_2_type > 0), IF ((r.extra_2_type = 1), extra_2 , extra_2 * SUM(rc.menge/1000)) , 0) + 
    IF ((r.finanzierung_satz > 0) AND (r.finanzierung_monate > 0) AND SUM(rc.menge/1000), 
    ((r.finanzierung_satz/100)/12) * r.finanzierung_monate * (
     SUM((rc.menge/1000) * (rw.preis/(IF (rw.is_zement = 1, 1.25 , 1))/(1 - (IFNULL(rw.h2o, 0)/100)))) + 
     SUM((rc.menge/1000) * pr.preis) + 
     IF ((r.extra_1_type > 0), IF ((r.extra_1_type = 1), extra_1 , extra_1 * SUM(rc.menge/1000)) , 0) + 
     IF ((r.extra_2_type > 0), IF ((r.extra_2_type = 1), extra_2 , extra_2 * SUM(rc.menge/1000)) , 0) 
    ) 
    , 0)) as repurchase_price, 

    /* Profit 
    * (Quantitiy/t * Price) - repurchase_price 
    */ 
    (SUM(rc.menge)/1000 * r.vk) - (

    SUM((rc.menge/1000) * (rw.preis/(IF (rw.is_zement = 1, 1.25 , 1))/(1 - (IFNULL(rw.h2o, 0)/100)))) + 
    SUM((rc.menge/1000) * pr.preis) + 
    IF ((r.extra_1_type > 0), IF ((r.extra_1_type = 1), extra_1 , extra_1 * SUM(rc.menge/1000)) , 0) + 
    IF ((r.extra_2_type > 0), IF ((r.extra_2_type = 1), extra_2 , extra_2 * SUM(rc.menge/1000)) , 0) + 
    IF ((r.finanzierung_satz > 0) AND (r.finanzierung_monate > 0) AND SUM(rc.menge/1000), 
    ((r.finanzierung_satz/100)/12) * r.finanzierung_monate * (
     SUM((rc.menge/1000) * (rw.preis/(IF (rw.is_zement = 1, 1.25 , 1))/(1 - (IFNULL(rw.h2o, 0)/100)))) + 
     SUM((rc.menge/1000) * pr.preis) + 
     IF ((r.extra_1_type > 0), IF ((r.extra_1_type = 1), extra_1 , extra_1 * SUM(rc.menge/1000)) , 0) + 
     IF ((r.extra_2_type > 0), IF ((r.extra_2_type = 1), extra_2 , extra_2 * SUM(rc.menge/1000)) , 0) 
    ) 
    , 0) 

    ) as profit, 

    /* Profit Percentage 
    * Profit/(repurchase_price/100) 
    */ 
    ((SUM(rc.menge)/1000 * r.vk) - (

    SUM((rc.menge/1000) * (rw.preis/(IF (rw.is_zement = 1, 1.25 , 1))/(1 - (IFNULL(rw.h2o, 0)/100)))) + 
    SUM((rc.menge/1000) * pr.preis) + 
    IF ((r.extra_1_type > 0), IF ((r.extra_1_type = 1), extra_1 , extra_1 * SUM(rc.menge/1000)) , 0) + 
    IF ((r.extra_2_type > 0), IF ((r.extra_2_type = 1), extra_2 , extra_2 * SUM(rc.menge/1000)) , 0) + 
    IF ((r.finanzierung_satz > 0) AND (r.finanzierung_monate > 0) AND SUM(rc.menge/1000), 
    ((r.finanzierung_satz/100)/12) * r.finanzierung_monate * (
     SUM((rc.menge/1000) * (rw.preis/(IF (rw.is_zement = 1, 1.25 , 1))/(1 - (IFNULL(rw.h2o, 0)/100)))) + 
     SUM((rc.menge/1000) * pr.preis) + 
     IF ((r.extra_1_type > 0), IF ((r.extra_1_type = 1), extra_1 , extra_1 * SUM(rc.menge/1000)) , 0) + 
     IF ((r.extra_2_type > 0), IF ((r.extra_2_type = 1), extra_2 , extra_2 * SUM(rc.menge/1000)) , 0) 
    ) 
    , 0) 

    )) 

    /

    ((

    SUM((rc.menge/1000) * (rw.preis/(IF (rw.is_zement = 1, 1.25 , 1))/(1 - (IFNULL(rw.h2o, 0)/100)))) + 
    SUM((rc.menge/1000) * pr.preis) + 
    IF ((r.extra_1_type > 0), IF ((r.extra_1_type = 1), extra_1 , extra_1 * SUM(rc.menge/1000)) , 0) + 
    IF ((r.extra_2_type > 0), IF ((r.extra_2_type = 1), extra_2 , extra_2 * SUM(rc.menge/1000)) , 0) + 
    IF ((r.finanzierung_satz > 0) AND (r.finanzierung_monate > 0) AND SUM(rc.menge/1000), 
    ((r.finanzierung_satz/100)/12) * r.finanzierung_monate * (
     SUM((rc.menge/1000) * (rw.preis/(IF (rw.is_zement = 1, 1.25 , 1))/(1 - (IFNULL(rw.h2o, 0)/100)))) + 
     SUM((rc.menge/1000) * pr.preis) + 
     IF ((r.extra_1_type > 0), IF ((r.extra_1_type = 1), extra_1 , extra_1 * SUM(rc.menge/1000)) , 0) + 
     IF ((r.extra_2_type > 0), IF ((r.extra_2_type = 1), extra_2 , extra_2 * SUM(rc.menge/1000)) , 0) 
    ) 
    , 0) 
    )/100) 

    as profit_percentage, 

FROM recipe as r 
LEFT JOIN recipecomponent as rc ON r.id = rc.recipe_id 
LEFT JOIN rawmaterial as rw ON rc.rawmaterial_id = rw.id 
LEFT JOIN press as pr ON r.press_id = pr.id 
GROUP BY r.id 
ORDER BY lieferdatum desc 

Как вы можете видеть, чтобы рассчитать цену, прибыль , процент прибыли, я часто использую тех же частей ... Возможно ли сократить мой SQL-запрос? Для того, чтобы сделать его более «элегантный» :)

Спасибо & Лучший Regars Саймон

+0

Оптимизация/сокращение кода не соответствует теме. Мы фиксируем проблемы, мы не оптимизируем ситуацию. –

+0

Вы можете попытаться написать хранимые функции для вашего дублированного кода http://www.mysqltutorial.org/mysql-stored-function/. Используя имя функции и параметры, вы можете получить читаемость в таком большом запросе (и вы можете повторно использовать свои функции в других запросах). –

+0

@ JonathanParentLévesque и сделать его чуть медленнее. – Drew

ответ

2

Как общий ответ, если вы повторите caculations в запросе, вы можете использовать полученные таблицы, чтобы избежать повторения:

select d.a, d.b, d.a*d.b 
from (
    select x+y+z as a, d+e+f as b 
    from yourtable 
) as d;