我试图在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')
);
答案 0 :(得分:1)
您的查询将更简单地写为:
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
等逻辑也很简单。date
关键字,后面可以跟一个标准日期。date
关键字)。答案 1 :(得分:0)
仅针对您的错误ORA-00904: ColumnName : invalid identifier
如果在子查询中对“Tots”,“CRIR”,“RT”,“Succes”列使用带引号的别名,则需要在主查询中使用相同的带引号别名。
引用的别名区分大小写。但是非引用别名不区分大小写。 Oracle将它们解释为大写。
这将是有效的:
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')
);