Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何缩短此MySQL查询(colums经常使用相同的sql部分…)_Mysql - Fatal编程技术网

如何缩短此MySQL查询(colums经常使用相同的sql部分…)

如何缩短此MySQL查询(colums经常使用相同的sql部分…),mysql,Mysql,我不是MySQL专业人士,但我的查询工作正常 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) /

我不是MySQL专业人士,但我的查询工作正常

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查询?让它更 ‘优雅’:)


谢谢&Best Regars Simon

作为一般性答案,如果您在查询中重复计算,可以使用派生表来避免重复:

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;

代码优化/缩减是离题的。我们解决问题,我们不优化东西。你可以尝试为你的重复代码编写一个存储函数。通过使用函数名和参数,您可以在这样的大型查询中提高可读性(并且您可以在其他查询中重用您的函数)。@JonathanParentLévesque,并使其稍微慢一点。人们可能会处理查询优化。是的,改进SQL查询是关于代码检查的主题,只要查询有效。