我试图执行算术运算符,这是我的查询,
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,
但它没有用,任何人都可以指导我如何解决它?!
答案 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(...)
函数中包装每个调用。如果您想要混合使用单行和多行字段,则必须将它们拆分为两个查询。