2016-10-06 2 views
1

Im пытается взять Всего счетчик транзакций из таблицы `между указанной датой в базе данных оракула. ​​Я написал подзапрос, чтобы группировать уникальные транзакции и когда я пытаюсь суммировать столбцы в подзапросе i получить сообщение ORA-00904: ColumnName: неверный идентификатор. Im новое для оракула, но это то же самое для меня работало на сервере sql.SUM на столбце из подзапроса в 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') 
); 
+0

Что такое сообщение полная ошибка? Он должен указывать вам на строку и позицию оскорбительного идентификатора, помогает ли это? (Поделитесь этой информацией здесь, если вам нужна дополнительная помощь.) – mathguy

ответ

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.
  • Oracle поддерживает ключевое слово date, за которым может следовать стандартная дата.
  • Почти тот же запрос работает в SQL Server (минус ключевое слово date).
+0

Я хочу сделать группу, чтобы сгруппировать все уникальные транзакции за день – Raju

+0

@Raju. , , Можно только ответить на вопрос, который вы задаете. Двойная агрегация не требуется. Если у вас есть * другой вопрос, задайте его как * другой вопрос. Если вы измените это, это может аннулировать этот ответ и, следовательно, привлечь downvotes. –

+0

вы правы. Я усложняю это. Благодаря! – Raju

0

Просто для вашей ошибки ORA-00904: ColumnName : invalid identifier

Если вы используете кавычки псевдонимов столбцов «Малыши», «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') 
); 
Смежные вопросы