【问题标题】:Summing a aggregate function对聚合函数求和
【发布时间】:2015-11-23 21:36:09
【问题描述】:

我正在尝试通过使用嵌套的 select 语句对聚合函数的总数求和,然后我在最后有一个 group by,但我收到一个错误,即关键字 by 不是预期的。

代码如下:

SELECT SUM(TOTAL) as CURTOTAL, SUM(LYTOTAL) as CURLYTOTAL
from
(select 
pf.*, ps.*, st.*, RANK() OVER (ORDER BY JULsaless desc) as TOTRANK,
 JANSALESS + FEBSALESS + MARSALESS + APRSALESS + MAYSALESS + JUNSALESS + JULSALES as TOTAL,
JANLYSAL + FEBLYSAL + MARLYSAL + APRLYSAL + MAYLYSAL + JUNLYSAL + JULLYSAL as LYTOTAL` 
from 
payssfile pf left joinpayssspec ps on pf.str#` = ps.str# and pf.item# = ps.item#  join storefile 
st on
pf.str# = st.str# where(year = 2015 and totaltype = '' and pf.str# =38))` group by pf.str#;`

然后当我去跑步时,我会收到以下消息:

此处没有预期关键字 BY。检测到语法错误 关键字 BY。有效令牌的部分列表是 FOR USE SKIP WAIT 除了优化之外,使用 FETCH ORDER UNION。

【问题讨论】:

  • 你的数据库是什么?
  • IBM 数据库
  • 不确定反引号是怎么回事。 pf.str# 都是 38 岁,你为什么要分组?你还在用TOTRANK吗?希望优化器足够聪明,可以去掉你并不真正需要的东西。看来可以直接对表达式求和sum(JANLYSAL + ... + JULLYSAL)
  • 我正在使用这个调用在 c# 中动态构建一个表,并且 totrank 与其他东西一起使用。从该语句中提取的所有内容都在表中使用

标签: sql db2 aggregate-functions


【解决方案1】:

无论您的 DBMS 是什么,您都缺少别名。 您应该始终为您正在使用的派生表分配一个别名。

派生表示例

select...
from (
-- this part of the query is a derived table:
select ... from ...
) as <ALIAS_HERE> -- must give derived table an alias

这就是你在GROUP BY附近出现错误的原因

在您的特定示例中,只需替换

)) group by pf.str#;

)) foo group by pf.str#; 
-- here you will name your derived table foo, to be able to call it's columns by foo.column_name

这里有一个reference 来回答关于 SO 的类似问题。

【讨论】:

    【解决方案2】:

    您似乎没有为子查询指定别名 pf,pf 是子查询中表的名称,而不是子查询本身。因此,按功能分组被破坏了。

    【讨论】:

      猜你喜欢
      • 2014-09-19
      • 1970-01-01
      • 1970-01-01
      • 2019-01-13
      • 1970-01-01
      • 2021-09-10
      • 1970-01-01
      • 1970-01-01
      • 2021-12-23
      相关资源
      最近更新 更多