来自ORACLE中子查询的列的SUM

拉朱

我试图从Oracle数据库中给定日期之间的表中获取总交易计数。我编写了一个子查询来对唯一交易进行分组,当我尝试对子查询中的列进行求和时,我收到错误ORA-00904:ColumnName:无效的标识符。我对oracle还是陌生的,但在sql server中对我来说却一样。

这是我的查询。

select sum(Tots),sum(CRIR),sum(RT),sum(Succes) from( 

select  ds.LOAN_ID,ds.CUST_ID,TO_CHAR(ds.SENT_DT_TIME, 'YYYY-MM-DD') "Dates", count(*) "Tots", 
  SUM(DECODE (ds.STATUS, 'CR', 1,'IR',1,0)) "CRIR",
  SUM(DECODE (ds.STATUS, 'R', 1,'T',1,0)) "RT",
  SUM(DECODE (ds.STATUS, 'S', 1, 0)) "Succes"
  FROM DATA_STRING ds
  WHERE TRUNC(ds.SENT_DT_TIME) BETWEEN to_date('2016-10-04','yyyy-mm-dd') and to_date('2016-10-07','yyyy-mm-dd')
  Group by ds.LOAN_ID,ds.CUST_ID,TO_CHAR(ds.SENT_DT_TIME, 'YYYY-MM-DD')
); 
戈登·利诺夫(Gordon Linoff)

您的查询将更简单地写为:

select count(*),
       sum(case when status in ('CR', 'IR') then 1 else 0 end) as CRIR, 
       sum(case when status in ('R', 'T') then 1 else 0 end) as RT, 
       sum(case when status in ('S') then 1 else 0 end) as Succes
from data_string ds
where ds.sent_dt_time >= date '2016-10-04' and
      ds.sent_dt_time < date '2016-10-08';

笔记:

  • 您想要执行的操作不需要两个聚合级别。
  • 使用case代替decode(),因为它case是标准SQL。合并诸如的逻辑也更简单in
  • Oracle支持date关键字,后跟一个标准日期。
  • 几乎完全相同的查询在SQL Server中有效(减去date关键字)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章