将MySQL别名字段添加到一起

将MySQL别名字段添加到一起,sql,mysql,Sql,Mysql,考虑类似于以下内容的查询: SELECT sum(EXPR) as total, sum(EXPR) as total2, sum(total+total2) as grandtotal FROM tablename 这将显示字段列表中的未知列总数 在计算中引用别名字段而无需重新键入求和表达式,因为两边的sum(EXPR)非常长。以下是在数据库引擎中执行操作的顺序 注意,这是一个关于如何执行事情的语义视图,数据库可能以不同的顺序执行事情,但它必须产生结果

考虑类似于以下内容的查询:

 SELECT sum(EXPR) as total,
        sum(EXPR) as total2, 
        sum(total+total2) as grandtotal 
 FROM tablename
这将显示字段列表中的未知列总数


在计算中引用别名字段而无需重新键入求和表达式,因为两边的
sum(EXPR)
非常长。

以下是在数据库引擎中执行操作的顺序

注意,这是一个关于如何执行事情的语义视图,数据库可能以不同的顺序执行事情,但它必须产生结果,就好像它是这样做的一样

  • 首先评估FROM部件,从何处获取数据
  • 然后在何处评估部件,我们对哪些行感兴趣
  • 然后对分组进行求值,我们如何组合结果行
  • 然后评估拥有部分,我们对哪些组感兴趣
  • 然后计算按部分排序的顺序,我们希望这些行/组的顺序是什么
  • 最后,对SELECT部分进行评估,我们对哪些列感兴趣
  • 不过,有些数据库引擎允许您通过在SELECT部分的第2列中使用“GROUP by 2”来绕过这一点,但是如果您坚持以上顺序,您现在应该知道代码不起作用的原因是没有名称为total或total2(尚未)的列

    换句话说,您需要重复这两个表达式,或者找到另一种方法

    您可以做的是使用子查询(如果您使用的是支持此功能的MySQL版本):

    根据评论删除其余部分

    但我对MySQL了解不多,因此您可能必须将子查询别名为:

    ...
    
        FROM tablename
        ) AS x
          ^-+^
            |
            +-- add this
    
    某些数据库引擎也不允许在子查询别名时使用关键字AS,因此如果上述操作不起作用,请尝试以下操作:

    ...
    
        FROM tablename
        ) x
          ^
          |
          +-- add this
    


    对于您的tsql粉丝…

    您可以使用变量:


    +1用于极端彻底性。是的,子查询需要使用别名。MySQL不支持WITH子句:@Lasse V.Karlsen:WITH子句不是特别支持TSQL-Oracle支持的非递归WITH,因为9i。我不关心WITH,答案是“为您TSQL粉丝”.我无法正确理解可能引发这样一个问题的思想混乱。我有机会检查我的答案,发现我错了。因此,我将其删除。谢谢你指出我的错误。不,你不能。见我对@kunal回答的评论。
    ...
    
        FROM tablename
        ) x
          ^
          |
          +-- add this
    
    SELECT total, total2, total + total2 as grandtotal from (
     SELECT sum(EXPR) as total, 
            sum(EXPR) as total2,  
     FROM tablename 
    ) x
    
    SELECT
    WITH Sums AS
    (
     SELECT sum(EXPR) as total, 
            sum(EXPR) as total2
     FROM tablename 
    )
    SELECT SUM(sums);