一起添加MySQL别名字段

时间:2010-07-30 16:50:18

标签: sql mysql

考虑类似于以下的查询:

 SELECT sum(EXPR) as total,
        sum(EXPR) as total2, 
        sum(total+total2) as grandtotal 
 FROM tablename

这会出现并在字段列表中显示未知列总数。

无论如何都要引用计算中的别名字段而不重新输入总和表达式,因为每一侧的sum(EXPR)都很长。

5 个答案:

答案 0 :(得分:23)

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

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

  1. 首先评估FROM部分,从哪里获取数据
  2. 然后评估WHERE部分,我们感兴趣的行
  3. 然后评估GROUP BY-part,我们如何组合结果行
  4. 然后评估HAVING-part,我们感兴趣的是哪些组
  5. 然后评估ORDER BY-part,我们想要那些行/组
  6. 最后,评估SELECT部分​​,我们感兴趣的列
  7. 有些数据库引擎允许你绕过这个,通过在SELECT-part中按第二列分组“GROUP BY 2”,但如果你坚持上面的顺序,你应该知道这个原因你的代码不起作用的是没有名称为total或total2(还)的列。

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

    你可以做的是使用一个子查询(假设你是支持这个的MySQL版本):

    SELECT total, total2, total+total2 as grandtotal
    FROM (
        SELECT sum(EXPR) as total, sum(EXPR) as total2
        FROM tablename
        ) x
    

    根据评论剔除其余部分。

    我对MySQL知之甚少,所以你可能需要对子查询进行别名:

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

    某些数据库引擎在使用子查询别名时也不允许使用关键字AS,因此如果上述操作不起作用,请尝试以下操作:

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

    <击>

答案 1 :(得分:6)

SELECT total, total2, total + total2 as grandtotal from (
 SELECT sum(EXPR) as total, 
        sum(EXPR) as total2,  
 FROM tablename 
) x

答案 2 :(得分:5)

SELECT @total1 := sum(EXPR), 
       @total2 := sum(EXPR),  
       @total1 + @total2 as grandtotal  
FROM tablename 

答案 3 :(得分:0)

SELECT
WITH Sums AS
(
 SELECT sum(EXPR) as total, 
        sum(EXPR) as total2
 FROM tablename 
)
SELECT SUM(sums);

为你的tsql粉丝...

答案 4 :(得分:0)