2011-01-05 1 views
1

Может кто-нибудь, пожалуйста, помогите мне с этим конкретным запросом? У меня ORA-00979 при попытке запустить это:Oracle ORA-00979 - «не выражение GROUP BY»

select t0.title, count (1) as count0, (select count (1) 
     from contract c1, se se1 
     where c1.c_id = se1.c_id 
     and se1.svc_id = 3 
     and se1.deleted = 0 
     and c1.deleted = 0 
     and c1.c_date between to_date ('07.10.2000', 'dd.mm.yyyy') 
         and to_date ('22.11.2010', 'dd.mm.yyyy') 
     and c1.company = 0 
     and c1.tdata.tariff = c0.tdata.tariff 
    ) as count1 
    from contract c0, se se0, tariff t0 
    where c0.c_id = se0.c_id 
    and se0.svc_id = 3 
    and se0.deleted = 0 
    and c0.deleted = 0 
    and c0.c_date between to_date ('21.11.2000', 'dd.mm.yyyy') 
       and to_date ('06.01.2011', 'dd.mm.yyyy') 
    and c0.company = 0 
    and t0.tariff_id = c0.tdata.tariff 
    group by t0.title 

ответ

3

Проблема заключается в вашем подзапросе с частью select count(1). Просто потому, что у него есть счет, он фактически не делает его совокупным. Это все еще подзапрос, который будет применяться к каждой строке, и, как вы видите, он использует значение c0.tdata.tariff, которое не входит в группу.

+0

Хорошо сказано. группировка по c0.tdata.tariff может организовать вещи. – Benoit

+1

@Benoit - но группировка этого дополнительного столбца изменит общий результат запроса. В то время как добавление групповой функции SUM вокруг скалярного подзапроса разрешает проблему и суммирует подсчеты в существующих группах. –

+0

Спасибо, это ответ на этот конкретный вопрос. Но лучшее решение общей проблемы было представлено здесь http://stackoverflow.com/questions/4605994/oracle-ora-00979-not-a-group-by-expression/4606082#4606082 – Arino

0

вашей группы, необходимо включить все неагрегированные столбцы из вашего списка выбора. В этом случае в группе отсутствует count1, возвращаемый вашим подзапросом.

1

Похоже, что скалярный подзапрос вызывает проблему - он не является ни групповой функцией, ни ее в списке GROUP BY.

Возможно, вы могли бы обойти его с чем-то вроде:

select t0.title, count (1) as count0, SUM(select count (1) ...) AS count1 
... 
1

Учитывая это, кажется, два экземпляра одного и того же запроса только над разными датами (я мог бы быть неправильно здесь ... это был длинный день) , вы могли бы просто упростить его и переписать следующим образом:

select 
    t0.title, 
    count (case when c0.c_date between to_date ('21.11.2000', 'dd.mm.yyyy') 
       and to_date ('06.01.2011', 'dd.mm.yyyy') then 1 end) as count0, 
    count (case when c0.c_date between to_date ('07.10.2000', 'dd.mm.yyyy') 
       and to_date ('22.11.2011', 'dd.mm.yyyy') then 1 end) as count1 
from 
    contract c0, 
    se se0, 
    tariff t0 
where 
    c0.c_id = se0.c_id 
    and se0.svc_id = 3 
    and se0.deleted = 0 
    and c0.deleted = 0 
    and (c0.c_date between to_date ('21.11.2000', 'dd.mm.yyyy') 
       and to_date ('06.01.2011', 'dd.mm.yyyy') 
    or c0.c_date between to_date ('07.10.2000', 'dd.mm.yyyy') 
         and to_date ('22.11.2010', 'dd.mm.yyyy')) 
    and c0.company = 0 
    and t0.tariff_id = c0.tdata.tariff 
group by t0.title 
+0

Это отличное решение, спасибо ! Я не знал, что можно решить такую ​​проблему, она также решает проблему «нулей». – Arino