使用变量计算的 MySQL 列未返回正确的结果

Calculated MySQL column using variable not returning right result

我正在尝试使用定义的变量来计算列,但结果加起来不正确。 我试过将变量声明移到括号内或使用聚合,但计算列(下例中的利润)与仅写出完整计算的结果不匹配。

请查看下面的示例查询。查询包含一个完整的连接所以我把它包括在内因为它可能是相关的?

select
    a.ID,
    c.Group1,
    a.group2,
    b.group3,
    @turnover :=
        sum( 
            a.Qty * 
            a.Price * 
            (100 - a.discount) / 100 *
            a.Rate
        ) as Turnover,
    @cost :=
        sum(
            a.Qty *
            a.Cost
        ) as Cost,
    @turnover - @cost as Profit
from
    a,
    b,
    c 
where
    a.id=b.id and
    a.id2=c.id
group by
    a.ID,
    c.Group1,
    a.group2,
    b.group3

Expected outcome:
╔════╦════════╦═════════╦═════════╦══════════╦═══════╦════════╗
║ ID ║ Group1 ║ Group 2 ║ Group 3 ║ Turnover ║ Cost  ║ Profit ║
╠════╬════════╬═════════╬═════════╬══════════╬═══════╬════════╣
║  1 ║ A      ║ X       ║      E  ║ 2.13     ║ 1.25  ║ 0.89   ║
║  2 ║ A      ║ Y       ║      F  ║ 1.93     ║ 1.61  ║ 0.32   ║
║  2 ║ A      ║ X       ║      G  ║ 46.74    ║ 36.93 ║ 9.81   ║
╚════╩════════╩═════════╩═════════╩══════════╩═══════╩════════╝
Actual outcome:
╔════╦════════╦═════════╦═════════╦══════════╦═══════╦════════╗
║ ID ║ Group1 ║ Group 2 ║ Group 3 ║ Turnover ║ Cost  ║ Profit ║
╠════╬════════╬═════════╬═════════╬══════════╬═══════╬════════╣
║  1 ║ A      ║ X       ║      E  ║ 2.13     ║ 1.25  ║ 9.81   ║
║  2 ║ A      ║ Y       ║      F  ║ 1.93     ║ 1.61  ║ 9.81   ║
║  2 ║ A      ║ X       ║      G  ║ 46.74    ║ 36.93 ║ 9.81   ║
╚════╩════════╩═════════╩═════════╩══════════╩═══════╩════════╝

Sample of the (joined) data in relation to the expected outcome.
╔════╦═════════╦═════════╦═════════╦═════╦═══════╦══════════╦══════╦═══════╗
║ ID ║ Group 1 ║ Group 2 ║ Group 3 ║ Qty ║ Price ║ Discount ║ Rate ║ Cost  ║
╠════╬═════════╬═════════╬═════════╬═════╬═══════╬══════════╬══════╬═══════╣
║  1 ║ A       ║ X       ║ E       ║   2 ║ 1.065 ║        0 ║    1 ║ 0.625 ║
║  2 ║ A       ║ Y       ║ F       ║   5 ║ 0.193 ║        0 ║    1 ║ 0.161 ║
║  2 ║ A       ║ Y       ║ F       ║   5 ║ 0.193 ║        0 ║    1 ║ 0.161 ║
║  2 ║ A       ║ X       ║ G       ║   1 ║ 20.74 ║        0 ║    1 ║ 20.93 ║
║  2 ║ A       ║ X       ║ G       ║   1 ║ 13    ║        0 ║    2 ║ 16    ║
╚════╩═════════╩═════════╩═════════╩═════╩═══════╩══════════╩══════╩═══════╝

因为您不使用重新分配..查看您的代码..您的查询似乎是一个正常的聚合查询 所以尝试重复代码

  select  a.ID
  , c.Group1
  , a.group2
  , b.group3
  , sum( a.Qty * a.Price *  (100 - a.discount) / 100 *  a.Rate) ) as Turnover
  , sum( a.Qty *  a.Cost ) as Cost
  , sum( a.Qty * a.Price *  (100 - a.discount) / 100 *  a.Rate) ) - sum( a.Qty *  a.Cost ) Profit
 from a
 INNER JOIN b ON a.id=b.id 
 INNER JOIN c ON a.id2=c.id
 group by a.ID, c.Group1,  a.group2, b.group3

或者如果您不喜欢重复的代码,请使用子查询

  select id, group1, group2, group3, Turnover, Cost, Turnover - Cost as Profit 
  from (
    select  a.ID
    , c.Group1
    , a.group2
    , b.group3
    , sum( a.Qty * a.Price *  (100 - a.discount) / 100 *  a.Rate) ) as Turnover
    , sum( a.Qty *  a.Cost ) as Cost
    , sum( a.Qty * a.Price *  (100 - a.discount) / 100 *  a.Rate) ) - sum( a.Qty *  a.Cost ) 
   from a
   INNER JOIN b ON a.id=b.id 
   INNER JOIN c ON a.id2=c.id
   group by a.ID, c.Group1,  a.group2, b.group3
  ) t