У меня есть базовые знания в sql, надеюсь, кто-нибудь сможет объяснить мне следующее: у меня есть следующий sql-запрос:
select
f001,
valid1,
encid1,
sum(val004) as AMOUNT#221,
conid1,
acc206
from
(
select
f001,
encid1,
acc206,
valid1,
val004,
conid1
from
table_tmp
where
valid2 = 4 and acc206=0 -- for EUR
) table1
group by
f001,
conid1,
valid1,
acc206
) table2
когда я запускаю сообщение об ошибке: 00979. 00000 - "not a GROUP BY expression"
. Это происходит потому, что у меня есть encid1
в предложении выбора, но not
в group by clause
. Когда я добавляю его в группу по сообщению об ошибке, оно исчезает, но мы не хотим группировать по encid1
. Теперь, когда я удаляю encid1
из предложения select, у меня нет возможности объединить результат с другими таблицами, используя encid1
. есть идеи, как это решить?
В GROUP BY отсутствует один столбец. (Выбранный столбец, а не аргумент функции агрегирования.)
@jarlh Я знаю, что объяснил это. Проблема в том, что нам не разрешено группировать по отсутствующему столбцу, который в данном случае encid1.
Извините, не внимательно прочитал. Возможно, вы можете использовать этот столбец в качестве аргумента функции агрегации? (В зависимости от данных и требований.)
Для каждой группы может быть несколько значений столбца encid1
. Оракул говорит: «Какой ты хочешь?» Максимум, минимум, среднее, конкатенация и т. д.
Было бы полезно, если бы вы предоставили минимально воспроизводимый пример. Некоторые примеры данных (ddl, dml — не скриншоты, а реальные скрипты) и то, что вы пытаетесь получить на выходе.
просто оберните его в агрегацию: MAX(encid1)
. Или какая-то другая логика агрегирования. Но вам придется каким-то образом агрегировать и выбирать только одно значение, если вы не группируете по нему.
Либо включите его в GROUP BY
:
SELECT f001,
valid1,
encid1,
SUM(val004) AS AMOUNT#221,
conid1,
acc206
from table_tmp
where valid2 = 4
and acc206 = 0 -- for EUR
group by
f001,
valid1,
encid1,
conid1,
acc206
В противном случае агрегируйте столбец encid1
:
SELECT f001,
valid1,
MIN(encid1) AS min_encid1,
MAX(encid1) AS max_encid1,
LISTAGG(encid1, ',') WITHIN GROUP (ORDER BY encid1) AS list_of_encid1,
SUM(val004) AS AMOUNT#221,
conid1,
acc206
from table_tmp
where valid2 = 4
and acc206 = 0 -- for EUR
group by
f001,
valid1,
conid1,
acc206
я использую оракул