使用变量计算的 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
我正在尝试使用定义的变量来计算列,但结果加起来不正确。 我试过将变量声明移到括号内或使用聚合,但计算列(下例中的利润)与仅写出完整计算的结果不匹配。
请查看下面的示例查询。查询包含一个完整的连接所以我把它包括在内因为它可能是相关的?
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