메뉴 건너뛰기

Korea Oracle User Group

23c Free Developer Release

GROUP BY 절에 컬럼 별칭이나 포지션 사용

 

정확히 이야기 하면 GROUP BY, GROUP BY CUBE, GROUP BY ROLLUP, GROUP BY GROUPING SETS 절에 

컬럼의 별칭(alias)이나 select 리스트의 포지션 값을 사용할 수 있게 되었습니다.

HAVING 절에는 컬럼의 별칭만 사용이 가능합니다.

 

group by, having 절에 컬럼의 별칭(alias)을 사용할 수 있게된 점은 가독성면에서 좋아진 방법인 듯합니다.

하지만 select 포지션 값 사용 부분은 오히려 긴 SQL 문장에서는 가독성을 해치는 방식이지 않을까 우려스럽습니다.

 

선호도가 있긴하겠지만 팀코딩이나 가독성면에서는 포지션값 사용은 추천하고 싶지 않네요

 

아래는 관련 내용을 테스트하고 이전 버전에서는 어떤지 확인해 보겠습니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SQL> select job_id job
  2       , avg(salary) avg_sal
  3       , count(*) job_id_count
  4       , max(hire_date) recently_member_date 
  5  from employees
  6  group by job
  7  having job_id_count > 6;
 
JOB                               AVG_SAL JOB_ID_COUNT RECENTLY
------------------------------ ---------- ------------ --------
SA_REP                               8350           30 08/04/21
SH_CLERK                             3215           20 08/02/03
ST_CLERK                             2785           20 08/03/08
 
경   과: 00:00:00.01

 

위의 select 문장에서는 group by와 having 절에 별칭을 사용해 봤습니다.

 

이번에는 포지션 값을 사용해 보도록 하겠습니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
SQL> select job_id job
  2       , avg(salary) avg_sal
  3       , count(*) job_id_count
  4       , max(hire_date) recently_member_date 
  5  from employees
  6  group by 1
  7  having job_id_count > 6;
select job_id
       *
1행에 오류:
ORA-00979"JOB_ID": GROUP BY 표현식과 일치하지 않음
 
 
경   과: 00:00:00.00

 

에러가 발생합니다. 포지션 값을 사용하려면 그냥 사용해서는 안되네요.

그럼 어떻게 사용하는지 내용을 확인해 보겠습니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
SQL> col name for a30
SQL> col value for a10
SQL> col display_value for a10
SQL> col default_value for a10
SQL> col isses_modifiable for a20
SQL> col description for a35
SQL> 
SQL> select name
  2        ,value
  3        ,display_value
  4        ,default_value
  5        ,isses_modifiable
  6        ,description
  7  from v$parameter
  8  where name = 'group_by_position_enabled';
 
NAME                           VALUE      DISPLAY_VA DEFAULT_VA ISSES_MODIFIABLE     DESCRIPTION
------------------------------ ---------- ---------- ---------- -------------------- -----------------------------------
group_by_position_enabled      FALSE      FALSE      FALSE      TRUE                 enable/disable group by position
 
경   과: 00:00:00.02

 

group_by_position_enabled 란 파라미터 값을 확인해 봅니다.

FALSE로 설정이 되어 있습니다. 그렇습니다. 이 파라미터의 값이 TRUE로 되어 있어야 쓸 수 있는 방식인 겁니다.

개인적인 생각으로는 기능을 빼고 이런 파라미터도 빼는 게 오히려 더 낫지 않을까 생각이 듭니다.

 

그럼 파라미터를 변경하고 확인해 보도록 하겠습니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
SQL> alter session set group_by_position_enabled=true;
 
세션이 변경되었습니다.
 
경   과: 00:00:00.00
SQL> select name
  2        ,value
  3        ,display_value
  4        ,default_value
  5        ,isses_modifiable
  6        ,description
  7  from v$parameter
  8  where name = 'group_by_position_enabled';
 
NAME                           VALUE      DISPLAY_VA DEFAULT_VA ISSES_MODIFIABLE     DESCRIPTION
------------------------------ ---------- ---------- ---------- -------------------- -----------------------------------
group_by_position_enabled      TRUE       TRUE       FALSE      TRUE                 enable/disable group by position
 
경   과: 00:00:00.05
SQL> select job_id job
  2       , avg(salary) avg_sal
  3       , count(*) job_id_count
  4       , max(hire_date) recently_member_date 
  5  from employees
  6  group by 1
  7  having job_id_count > 6;
 
JOB                               AVG_SAL JOB_ID_COUNT RECENTLY
------------------------------ ---------- ------------ --------
SA_REP                               8350           30 08/04/21
SH_CLERK                             3215           20 08/02/03
ST_CLERK                             2785           20 08/03/08
 
경   과: 00:00:00.01

 

정상적으로 동작하는 것을 확인할 수 있습니다.

별칭 사용은 추천하지만 포지션 값 사용은 비추천입니다.

 

이번에는 GROUP BY 절 사용에 있어서 개선사항을 확인해 봤습니다.

새로운 기능에 대해서 지속적으로 테스트하고 확인해 보도록 하겠습니다.

 

 

 

 

 

위로