在SELECT语句中重复使用别名

12

我想要做的是添加另一列,计算(cr - dr)。

由于在SELECT子句中不能重复使用别名,你如何计算total

    SELECT SUM(b.bet_win * cy.fx_rate )as dr, SUM(b.bet_loss * cy.fx_rate ) as cr, cr+dr as total
    FROM ....
    WHERE ....

1
很遗憾,你提出的语法在标准SQL中是非法的,因为这样的灵活性会很有用。顺便说一下,在Access(ACE、Jet或其他)中,你的语法是有效的,但Access要求表达式从左到右进行评估,而列排序只会使SQL变得更加不灵活 :( - onedaywhen
可能是Can I reuse a calculated field in a SELECT query?的重复问题。 - Ciro Santilli OurBigBook.com
3个回答

14
在SQL Server或Oracle中,我会使用CTE,但由于你正在使用MySQL,因此您需要使用子查询:
SELECT dr, cr, cr + dr as total 
FROM (
    SELECT 
         SUM(b.bet_win * cy.fx_rate ) as dr, 
         SUM(b.bet_loss * cy.fx_rate ) as cr
    FROM ....
    WHERE ....) t;

11
编辑:不起作用。请参考评论区。 在这种情况下,使用用户变量更快吗?
SELECT
  @dr:=SUM(b.bet_win * cy.fx_rate ),
  @cr:=SUM(b.bet_loss * cy.fx_rate ), 
  @cr+@dr as total

7
在MySQL中,用户自定义变量的工作方式不是这样的。只有在处理完行之后才会设置@dr和@cr的值。当构建结果集的第一行时,@dr为NULL,@cr也为NULL,所以“total”为NULL。然后将@dr设置为赢的总和,@cr设置为输的总和。在构建第二行并计算“total”时,@dr和@cr具有上一行的值。因此,“total”将是上一行的总数。 - jtanium
3
哇,确实!MySQL手册编辑应该把这个放在页面顶部,而不是那么晚才放。谢谢你告诉我们,jtanium。 - e-motiv

-1
您可以在“总计”列中重复计算。
SELECT 
    SUM(b.bet_win * cy.fx_rate) as dr, 
    SUM(b.bet_loss * cy.fx_rate) as cr, 
    SUM(b.bet_win * cy.fx_rate) + SUM(b.bet_loss * cy.fx_rate) as total
FROM ....
WHERE ....

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接