使用变量进行MySQL计算

时间:2013-04-29 11:48:02

标签: mysql

为什么这不起作用?我想得到结果:

(@sum_hours * @rate_hours) + (@sum_travel * @rate_travel) + (@sum_miles * @rate_miles)

我的子查询结果如下:

@sum_hours = 5.00000, @sum_travel = 2.00000, @sum_miles = 0.00000

@rate_hours = 35.00000, @rate_travel = 35.00000, @rate_miles = NULL

@_rate_hours = CAST(IF(@rate_hours, @rate_hours, 0) AS DECIMAL(10, 5)) = 35.00000 @_rate_travel = CAST(IF(@rate_travel, @rate_travel, 0) AS DECIMAL(10, 5)) = 35.00000 @_rate_miles = CAST(IF(@rate_miles, @rate_miles, 0) AS DECIMAL(10, 5)) = 0.00000

所以现在我有一些价值观,我正在做:

@total:= (@sum_hours * @_rate_hours)

我希望它为175,但它返回NULL。如果我直接宣布@sum_hours为5

@sum_hours:= 5

我按预期得到175分。难道我做错了什么?假如我不知道这些值应该是5,35和175,我怎么能让它返回175?

@sum_hours正在被转换为十进制,但是无论是否使用强制转换,它都不起作用。


编辑:

这是查询的剥离版本,因为JOIN和子查询不相关,只是返回详细信息。所有数字字段都作为FLOAT存储在数据库中。值在结果中得到确认,但@total的计算不起作用(返回null)。

我使用COALESCE和其他一些方法解决了这个问题,但我仍然很好奇它为什么不能正确计算 - 或者我做错了什么。

SELECT

  @sum_hours:= CAST(hours AS DECIMAL(10, 5)),
  @sum_travel:= CAST(travel AS DECIMAL(10, 5)),
  @sum_miles:= CAST(miles AS DECIMAL(10, 5)),

  @rate_hours:= (SELECT ... returns 35),
  @rate_travel:= (SELECT ... returns 35),
  @rate_miles:= (SELECT ... returns NULL),

  @_rate_hours = CAST(IF(@rate_hours, @rate_hours, 0) AS DECIMAL(10, 5)),
  @_rate_travel = CAST(IF(@rate_travel, @rate_travel, 0) AS DECIMAL(10, 5)),
  @_rate_miles = CAST(IF(@rate_miles, @rate_miles, 0) AS DECIMAL(10, 5)),

  @total:= (@sum_hours * @_rate_hours) + (@sum_travel * @_rate_travel) + (@sum_miles * @_rate_miles)

FROM table
WHERE
  id = '...'
GROUP BY id

0 个答案:

没有答案