Группировать по псевдониму (Oracle)

Как «сгруппировать по» запросу с использованием псевдонима, например:

select count(*), (select * from....) as alias_column 
from table 
group by alias_column

Я получаю сообщение об ошибке "alias_column": INVALID_IDENTIFIER. Почему? Как сгруппировать этот запрос?

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
36
0
81 513
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Ответ принят как подходящий
select
  count(count_col),
  alias_column
from
  (
  select 
    count_col, 
    (select value from....) as alias_column 
  from 
    table
  ) as inline
group by 
  alias_column

Группировка обычно работает, если вы повторяете соответствующее выражение в предложении GROUP BY. Просто упомянуть псевдоним невозможно, потому что шаг SELECT - это последний шаг, на котором происходит выполнение запроса, группировка происходит раньше, когда имена псевдонимов еще не определены.

Чтобы GROUP BY результат подзапроса, вам придется сделать небольшой обходной путь и использовать вложенный запрос, как указано выше.

Вложите запрос в столбец псевдонима:

select count(*), alias_column
from
( select empno, (select deptno from emp where emp.empno = e.empno) as alias_column
  from emp e
)
group by alias_column;
select count(*), (select * from....) as alias_column 
from table 
group by (select * from....)

В Oracle вы не можете использовать псевдоним в предложении group by.

Чтобы использовать псевдоним в Oracle, вам необходимо убедиться, что псевдоним был определен вашим запросом в точке, в которой псевдоним используется.

Самый простой способ сделать это - просто рассматривать исходный запрос как подзапрос - в данном случае

select count(*), (select * from....) as alias_column 
from table 
group by (select * from....)

становится

select count, alias_column 
from
  (select count(*) as count, (select * from....) as alias_column 
  from table)
group by alias_column 

Я не могу говорить о последствиях для производительности, но очень быстро написать, если вы пытаетесь повторно использовать псевдоним в своем запросе - бросьте все в круглые скобки и прыгните на уровень ...

Если вам не нужно использовать псевдоним, вы можете сделать это следующим образом:

select  
EXTRACT(year from CURRENT_DATE), count(*) from something
group by EXTRACT(year from CURRENT_DATE)
order by EXTRACT(year from CURRENT_DATE)

Вместо использования псевдонима и подзапроса.

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