Как выбрать имя столбца, которое не может быть в предложении group by?

У меня есть базовые знания в 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. есть идеи, как это решить?

я использую оракул

user1167753 05.04.2024 15:21

В GROUP BY отсутствует один столбец. (Выбранный столбец, а не аргумент функции агрегирования.)

jarlh 05.04.2024 15:22

@jarlh Я знаю, что объяснил это. Проблема в том, что нам не разрешено группировать по отсутствующему столбцу, который в данном случае encid1.

user1167753 05.04.2024 15:24

Извините, не внимательно прочитал. Возможно, вы можете использовать этот столбец в качестве аргумента функции агрегации? (В зависимости от данных и требований.)

jarlh 05.04.2024 15:25

Для каждой группы может быть несколько значений столбца encid1. Оракул говорит: «Какой ты хочешь?» Максимум, минимум, среднее, конкатенация и т. д.

The Impaler 05.04.2024 15:26

Было бы полезно, если бы вы предоставили минимально воспроизводимый пример. Некоторые примеры данных (ddl, dml — не скриншоты, а реальные скрипты) и то, что вы пытаетесь получить на выходе.

Koen Lostrie 05.04.2024 15:30

просто оберните его в агрегацию: MAX(encid1). Или какая-то другая логика агрегирования. Но вам придется каким-то образом агрегировать и выбирать только одно значение, если вы не группируете по нему.

Paul W 05.04.2024 15:34
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
7
59
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Либо включите его в 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

Другие вопросы по теме