Я не 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 Саймон
Оптимизация/сокращение кода не соответствует теме. Мы фиксируем проблемы, мы не оптимизируем ситуацию. –
Вы можете попытаться написать хранимые функции для вашего дублированного кода http://www.mysqltutorial.org/mysql-stored-function/. Используя имя функции и параметры, вы можете получить читаемость в таком большом запросе (и вы можете повторно использовать свои функции в других запросах). –
@ JonathanParentLévesque и сделать его чуть медленнее. – Drew