0

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

(@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
4

0 回答 0