Oracle SQL; простой запрос, дающий «не группировка по заявлению» - PullRequest
1 голос
/ 12 февраля 2020

ОРИГИНАЛЬНЫЙ ВОПРОС: Этот простой запрос является действительным SQL сгруппированным оператором. Что мне не хватает? Каждое поле группировки входит в группу как?

РЕДАКТИРОВАТЬ: я смог запустить запрос, просто приведя SUM к десятичному числу. Может ли кто-нибудь объяснить ниже?

Нерабочий запрос:

/* ERROR: not a group by expression */
select account, to_char(trans_date, 'mm-yyyy') mnth_yr,
       sum(total_duration)/60 as mou   
from chuck.cdr_data_summary@chuckdb
where rate_band_type = 'ALC1' and account = '0204927766' and description_text like '%Inbound%'
      and trans_date >= '01-jan-2019' and trans_date < '01-jan-2020'
group by account, to_char(trans_date, 'mm-yyyy')
order by account;

Рабочий запрос:

/* no error;  only change was the cast(... as decimal..)*/
select account, to_char(trans_date, 'mm-yyyy') mnth_yr,
       cast(sum(total_duration)/60 as decimal(18,2)) as mou   
from chuck.cdr_data_summary@chuckdb
where rate_band_type = 'ALC1' and account = '0204927766' and description_text like '%Inbound%'
      and trans_date >= '01-jan-2019' and trans_date < '01-jan-2020'
group by account, to_char(trans_date, 'mm-yyyy')
order by account;

РЕДАКТИРОВАТЬ: за комментарий, вот мой SQL* PLUS сеанс :

Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, Automatic Storage Management, OLAP, Data Mining
and Real Application Testing options

SQL> select account, to_char(trans_date, 'mm-yyyy') mnth_yr,
  2         (sum(total_duration)/60) as mou
  3  from chuck.cdr_data_summary@chuckdb
  4  where rate_band_type = 'ALC1' and account = '0204927766' and description_text like '%Inbound%'
  5        and trans_date >= '01-jan-2019' and trans_date < '01-jan-2020'
  6  group by account, to_char(trans_date, 'mm-yyyy')
  7  order by account;
select account, to_char(trans_date, 'mm-yyyy') mnth_yr,
*
ERROR at line 1:
ORA-00979: not a GROUP BY expression
ORA-02063: preceding line from CHUCKDB


SQL>

1 Ответ

1 голос
/ 12 февраля 2020

В этом нет ничего плохого.

  • Строки # 1 - 8 представляют образцы данных
  • Строки # 9 и далее - ваш запрос, слегка измененный:
    • I использовал CTE в качестве источника в строке # 12
    • , строки # 16 и 17 используют даты, а не строки (как вы и не должны)

SQL> with cdr_data_summary as
  2    (select '0204927766' account,
  3            120 total_duration,
  4            'ALC1' rate_band_type,
  5            'xxxInboundyyy' description_text ,
  6            date '2019-01-01' trans_date
  7     from dual
  8    )
  9  SELECT account,
 10         TO_CHAR(trans_date,'mm-yyyy')AS yr_mnth,
 11         SUM(total_duration)/ 60 AS mou
 12  from cdr_data_summary   -- chuck.cdr_data_summary@chuckdb
 13  WHERE rate_band_type = 'ALC1'
 14    AND account = '0204927766'
 15    AND description_text LIKE '%Inbound%'
 16    AND trans_date >= date '2019-01-01' --'01-jan-2019'
 17    AND trans_date < date '2020-01-01'  --'01-jan-2020'
 18  GROUP BY account,
 19           TO_CHAR(trans_date, 'mm-yyyy');

ACCOUNT    YR_MNTH        MOU
---------- ------- ----------
0204927766 01-2019          2

SQL>

Пожалуйста, опубликуйте сеанс SQL* Plus, чтобы мы могли видеть, что вы действительно сделали и как Oracle ответил.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...