Oracle ORA-00979 - «не выражение GROUP BY» - PullRequest
1 голос
/ 05 января 2011

Кто-нибудь может помочь мне с этим конкретным запросом?У меня ORA-00979 при попытке запустить это:

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

Ответы [ 4 ]

3 голосов
/ 05 января 2011

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

1 голос
/ 05 января 2011

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

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
1 голос
/ 05 января 2011

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

Возможно, вы могли бы обойти его следующим образом:*

0 голосов
/ 05 января 2011

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

...