ORA-00937 не является групповой функцией для одной группы при использовании условия CASE - PullRequest
1 голос
/ 23 апреля 2020

Я искал несколько часов, как решить ORA-00937: не функция для одной группы , и ни один из них не объясняет, почему я получаю ошибку. Насколько я понимаю, при применении агрегатной функции в операторе выбора к одному или нескольким столбцам, вам следует включать столбцы, которые не агрегируются в операторе выбора по. Я сделал это, однако ошибка всегда возникает в строке 2, столбце 9, где c .data_entry_date находится во второй строке ниже. Эта ошибка возникает только тогда, когда я применяю логи c из этой части запроса:

SUM(CASE 
    WHEN EXTRACT(YEAR FROM a.issue_date) < 1986 THEN
        CASE
          WHEN floor((c.data_entry_date - to_date(TO_CHAR(a.issue_date, 'DD-MON') || '-1986'))/365) between 0 and 5 then (7*(sum(a.area_in_hectares)))
          WHEN floor((c.data_entry_date - to_date(TO_CHAR(a.issue_date, 'DD-MON') || '-1986'))/365) between 6 and 10 then (10*(sum(a.area_in_hectares)))
          WHEN floor((c.data_entry_date - to_date(TO_CHAR(a.issue_date, 'DD-MON') || '-1986'))/365) between 11 and 15 then (15*(sum(a.area_in_hectares)))
          WHEN floor((c.data_entry_date - to_date(TO_CHAR(a.issue_date, 'DD-MON') || '-1986'))/365) between 16 and 20 then (20*(sum(a.area_in_hectares)))
          WHEN floor((c.data_entry_date - to_date(TO_CHAR(a.issue_date, 'DD-MON') || '-1986'))/365) between 21 and 25 then (25*(sum(a.area_in_hectares)))
          WHEN floor((c.data_entry_date - to_date(TO_CHAR(a.issue_date, 'DD-MON') || '-1986'))/365) between 26 and 30 then (30*(sum(a.area_in_hectares)))
          WHEN floor((c.data_entry_date - to_date(TO_CHAR(a.issue_date, 'DD-MON') || '-1986'))/365) between 31 and 35 then (35*(sum(a.area_in_hectares)))
          WHEN floor((c.data_entry_date - to_date(TO_CHAR(a.issue_date, 'DD-MON') || '-1986'))/365) between 36 and 40 then (40*(sum(a.area_in_hectares)))
          WHEN floor((c.data_entry_date - to_date(TO_CHAR(a.issue_date, 'DD-MON') || '-1986'))/365) between 41 and 45 then (45*(sum(a.area_in_hectares)))
          WHEN floor((c.data_entry_date - to_date(TO_CHAR(a.issue_date, 'DD-MON') || '-1986'))/365) between 46 and 50 then (50*(sum(a.area_in_hectares)))
        END
    END)

Если я прокомментирую, что специфицирует c CASE logi c, тогда запрос выполняется успешно. Тем не менее, CASE logi c является довольно новым для меня. Я попробовал творческий поиск в Google, чтобы найти какое-то решение. Я играл с различными колонками в группе, и я не вижу, чтобы заставить его работать. Мне интересно, если агрегация SUM в этом CASE logi c столбце c .data_entry_date противоречит тому, как я использовал его в первом столбце в SELECT оператор? Вот мой более широкий код, если кто-то хочет заняться решением:

select 
TO_CHAR(c.data_entry_date,'yyyy-mm') as "Year-Month",
c.event_type_code "Event Code",
d.description "Event Description",
e.description "Title Type",
sum(a.area_in_hectares) "Sum hectares",
Count(unique(a.t_number_id)) "Count of T Number IDs",
CASE
  WHEN c.event_type_code = 'L_SPAY' and a.tenure_type_code = 'C' and a.tenure_sub_type_code = 'L' THEN (10*(sum(a.area_in_hectares)))

  WHEN c.event_type_code = 'L_SPAY' and a.tenure_type_code = 'C' and a.tenure_sub_type_code = 'S' THEN 
    SUM(CASE 
        WHEN EXTRACT(YEAR FROM a.issue_date) < 1986 THEN
            CASE
              WHEN floor((c.data_entry_date - to_date(TO_CHAR(a.issue_date, 'DD-MON') || '-1986'))/365) between 0 and 5 then (7*(sum(a.area_in_hectares)))
              WHEN floor((c.data_entry_date - to_date(TO_CHAR(a.issue_date, 'DD-MON') || '-1986'))/365) between 6 and 10 then (10*(sum(a.area_in_hectares)))
              WHEN floor((c.data_entry_date - to_date(TO_CHAR(a.issue_date, 'DD-MON') || '-1986'))/365) between 11 and 15 then (15*(sum(a.area_in_hectares)))
              WHEN floor((c.data_entry_date - to_date(TO_CHAR(a.issue_date, 'DD-MON') || '-1986'))/365) between 16 and 20 then (20*(sum(a.area_in_hectares)))
              WHEN floor((c.data_entry_date - to_date(TO_CHAR(a.issue_date, 'DD-MON') || '-1986'))/365) between 21 and 25 then (25*(sum(a.area_in_hectares)))
              WHEN floor((c.data_entry_date - to_date(TO_CHAR(a.issue_date, 'DD-MON') || '-1986'))/365) between 26 and 30 then (30*(sum(a.area_in_hectares)))
              WHEN floor((c.data_entry_date - to_date(TO_CHAR(a.issue_date, 'DD-MON') || '-1986'))/365) between 31 and 35 then (35*(sum(a.area_in_hectares)))
              WHEN floor((c.data_entry_date - to_date(TO_CHAR(a.issue_date, 'DD-MON') || '-1986'))/365) between 36 and 40 then (40*(sum(a.area_in_hectares)))
              WHEN floor((c.data_entry_date - to_date(TO_CHAR(a.issue_date, 'DD-MON') || '-1986'))/365) between 41 and 45 then (45*(sum(a.area_in_hectares)))
              WHEN floor((c.data_entry_date - to_date(TO_CHAR(a.issue_date, 'DD-MON') || '-1986'))/365) between 46 and 50 then (50*(sum(a.area_in_hectares)))
            END
        END)

END AS Revenue
from
tenure a, 
tenure_event_xref b,
event c,
event_type_code d,
title_type_code e
where
a.t_number_id = b.t_number_id
and b.e_number_id = c.e_number_id
and c.event_type_code = d.event_type_code
and a.title_type_code = e.title_type_code

group by TO_CHAR(c.data_entry_date, 'yyyy-mm'), c.event_type_code, d.description, e.description, a.tenure_type_code, a.tenure_sub_type_code

Очень признателен!

1 Ответ

1 голос
/ 23 апреля 2020

Удалить sum() в предложениях then. Они case уже являются аргументом sum(). Нет необходимости делать sum() в пределах sum() - это не разрешено.

...