MySql:如何在带有where子句的select中使用定义的变量

时间:2018-08-17 02:51:07

标签: mysql sql

我正在尝试对列进行一些计算,并使用“低”和“高”之间的位置来过滤结果。为了获得最终结果,我在select语句中使用了变量,当我使用从上一次计算得出的最终值并将其与where子句一起使用时,它附带了0个结果。请参考以下我的sql代码:-

SELECT autorates.Buy AS 'Buy', Carrier.FuelLevy, 
@FuelLevyTotal := ((autorates.Buy * Carrier.FuelLevy) + autorates.Buy) AS 'withFuelLevyTotal', 
@FuelLevyGSTTotal := ((@FuelLevyTotal * 0.10) + @FuelLevyTotal) AS 'withGSTrate',  
@MarginTotal := ((Margin.Margin * @FuelLevyGSTTotal) + @FuelLevyGSTTotal) AS 'Sell',  // Final Results after all calculations
Margin.Low, Margin.High, autorates.OriginType, autorates.DestinationType, autorates.GoodsAllowed, Carrier.Disabled
FROM  Margin, autorates
LEFT JOIN Carrier on Carrier.ID = autorates.Carrier
WHERE autorates.Car='4WD/Van' AND autorates.Origin = 'Melbourne' AND autorates.Destination = 'Sydney' 
AND Carrier.Disabled  = 0 AND 
autorates.GoodsAllowed = 0  AND 
@MarginTotal BETWEEN Margin.Low and Margin.High           //Here is the problem
GROUP BY autorates.OriginType , autorates.DestinationType      
ORDER by @MarginTotal

以下屏幕截图是我在运行时得到的结果,这是错误的:

enter image description here

获得卖出的公式是:

  1. 购买* FuelLevy = withFuelLevyTotal
  2. withFuelLevyTotal * 10%(GST)= withGSTrate。 现在,我希望该值可以查看Margin表,并获得margin.low和margin.high之间的Margin。
  3. 卖出=(withGSTrate *保证金)+ withGSTrate。

以下屏幕截图为边距表。 enter image description here

下面的屏幕快照是Fuellevy(即0.1604)

enter image description here

1 个答案:

答案 0 :(得分:1)

我建议使用存储的proc而不是单个查询。上面的查询将不起作用。 MarginTotal是在查询中定义的变量,不能在where语句中使用。可以使用内部查询,但是有点复杂。