如何将两个字段相加

时间:2017-11-16 19:50:35

标签: mysql sql oracle

我试图执行算术运算符,这是我的查询,

SELECT

    GLB.BEGIN_BALANCE_DR_BEQ + GLB.BEGIN_BALANCE_CR_BEQ AS ACTIVITY,
    GLB.PERIOD_NET_DR + GLB.PERIOD_NET_CR AS BEG_BALANCE ,
    ACTIVITY + BEG_BALANCE AS END_BALANCE,
    SUM(ACTIVITY) AS TOTAL_ACT,
    SUM(BEG_BALANCE) AS TOTAL_BEG_BALANCE,
    SUM(END_BALANCE) AS TOTAL_END_BALANCE, 

但它没有用,任何人都可以指导我如何解决它?!

3 个答案:

答案 0 :(得分:2)

您不能在相同的选择级别中使用别名(并且您不能使用聚合级别而不能使用聚合列而不使用适当的组)

您应该使用子查询来快速使用别名,例如:

  SELECT 
      SUM(ACTIVITY) AS TOTAL_ACT,
      SUM(BEG_BALANCE) AS TOTAL_BEG_BALANCE,
      SUM(END_BALANCE) AS TOTAL_END_BALANCE
      FROM( 
        SELECT

        GLB.BEGIN_BALANCE_DR_BEQ + GLB.BEGIN_BALANCE_CR_BEQ AS ACTIVITY,
        GLB.PERIOD_NET_DR + GLB.PERIOD_NET_CR AS BEG_BALANCE ,
        ACTIVITY + BEG_BALANCE AS END_BALANCE
        FROM My_TABLE 
      ) T

答案 1 :(得分:1)

对于要在SELECT列表中的其他位置或同一查询的WHERE子句中引用的查询的SELECT列表中分配的别名无效。 (MySQL确实有扩展,允许在ORDER BY和HAVING中引用列别名。)

如果我们想在SELECT列表中引用别名,一个选项是将查询转换为内联视图。外部查询可以将别名引用为列名。举个简单的例子......

 SELECT c.myalias
      , c.fee
      , c.myalias + c.fee AS grand_tot
   FROM ( SELECT t.somecol + t.othercol  AS `myalias`
               , t.fi + t.fo + t.fum     AS `fee`
            FROM t
        ) c

出于性能原因,我们通常会避免这样做,因为将内联视图具体化为派生表的成本。即使我们必须重复表达式,避免内联视图和引用可用列也会更有效。

 SELECT t.somecol + t.othercol                       AS `myalias`
      , t.fi + t.fo + t.fum                          AS `fee`
      , t.somecol + t.othercol + t.fi + t.fo + t.fum AS `grand_tot`
   FROM t 

不清楚结果集需要返回什么。

如果我们只想要总计,我就避免使用内联视图,只需咬住子弹并使用引用SELECT列表中可用列的表达式。这似乎是一个奇怪的结果集返回:

SELECT SUM( GLB.BEGIN_BALANCE_DR_BEQ 
          + GLB.BEGIN_BALANCE_CR_BEQ
       ) AS TOTAL_ACT
     , SUM( GLB.PERIOD_NET_DR
          + GLB.PERIOD_NET_CR
       ) AS TOTAL_BEG_BALANCE
     , SUM( GLB_GLB.BEGIN_BALANCE_DR_BEQ 
          + GLB.BEGIN_BALANCE_CR_BEQ 
          + GLB.PERIOD_NET_DR
          + GLB.PERIOD_NET_CR
       ) AS TOTAL_END_BALANCE
  FROM ... 

答案 2 :(得分:0)

您在此查询中混合了两种类型的操作。前三行是单行操作,后三行是多行操作。如上所述,您要求每行GLB.BEGIN_BALANCE_DR_BEQ + GLB.BEGIN_BALANCE_CR_BEQ AS ACTIVITY的值,以及所有行中ACTIVITY的总和。

如果你想要所有行中每个字段的总和,那么你必须在sum(...)函数中包装每个调用。如果您想要混合使用单行和多行字段,则必须将它们拆分为两个查询。