본문 바로가기
SQL 문제 풀기/2. SQLD 기출 : 2024.3.01~2024.4.25

<SQLD 19> 그룹함수 사용 SQL에 대한 기출문제

by HYEHYE_SON 2024. 3. 19.
728x90

매일 SQLD 기출 문제 풀기 챌린지


 


문제19.

아래의 SQL문을 완성하시오.

 

[ 테이블명: TAB1 ]

COL1
1000
1000
1000
3000
3000
4000
9999
9999

 

[ 결과 ]

COL1
3000
9999

 

SELECT COL1 
  FROM TAB1
      (   ?   ) COL1 
      HAVING COUNT(*) = 2
      ORDER BY (CASE WHEN COL1 = 1000 THEN 0 ELSE COL1 END);

 

주관식 답 : 


해설해보기

# 1. SELECT 절
COL1의 값을 출력


# 2. FROM 절
COL1을 가져올 테이블명을 기입


# 3. (   ?   ) 과 HAVING절
우선 HAVING을 사용했다는 것을 보면,
GROUP BY 함수를 유추 할 수 있다.
또한 출력된 결과를 확인하면 3000과 9000만 출력된 것을 확인할 수 있다.

그렇다면 COL1 1000, 4000의 값이 HAVING절로 인해 출력되지 않은 건데
HAVING COUNT(*) = 2는 
COL1의 값을 기준으로 두고 그룹으로 묶었을 때 
각 그룹의 수가 2건인것만 출력한다고 보면 된다.

따라서 1000은 3건이고, 4000은 1건 이므로 출력되지 않는다.


# 4. ORDER BY절
order by절의 CASE WHEN을 살펴보면,
COL1 =1000이라면 0 , 아닐경우 COL1 값을 출력하라는 문장이다.

이에 따라 COL1의 값은
0, 0, 0, 3000, 3000,  4000, 9999, 9999 로 구성이 되며,
group by 에 의하여 0, 3000, 4000, 9999가 된다. 

그 중 having절에 의해 2건인 것만 보면,
3000, 9999만 남는데 이를 정렬하면
문제에 제시된 결과와 같은 데이터를 얻을 수 있게 된다.

정렬은 기본값이 asc이기 때문에 3000부터 오름차순으로 정렬된다.

order by 절의 case when에 대한 자세한 설명은
직접 실행해보기에서 예시와 함께 확인!

 
직접 실행해보기

# 이해를 위해 HAVING 절을 제외하고 쿼리문 출력

select col1
    from tab1
    group by col1
    order by ( case when col1 = 1000 then 0 else col1 end );

아래의 결과를 보면 1000이 0으로 대체되고 나서

0, 3000, 4000, 9999를 두고 ascending하게 정렬 후 

COL1을 출력한 결과이다.

# 1000을 10000으로 바꾸는 case when문을 날려 결과 확인

select col1
    from tab1
    group by col1
    order by ( case when col1 = 1000 then 10000 else col1 end );

아래의 결과를 보면 1000이 10000으로 대체 후

10000, 3000, 4000, 9999를 두고 ascending하게 정렬 후 

COL1을 출력한 결과이다.

 

ascending하게 정렬하면 3000, 4000, 9999, 10000이며

이에 대응하는 col1의 값은 3000, 4000, 9999, 1000 이므로

아래와 같은 결과가 발생하는 것이다.

 

# 최종 결과 쿼리문 실행

SELECT COL1 
  FROM TAB1
      GROUP BY COL1 
      HAVING COUNT(*) = 2
      ORDER BY (CASE WHEN COL1 = 1000 THEN 0 ELSE COL1 END);

 

 


관련 스크립트

drop table  tab1;

create  table  tab1
( col1   number(10)  );

insert  into  tab1  values(1000);
insert  into  tab1  values(1000);
insert  into  tab1  values(1000);
insert  into  tab1  values(3000);
insert  into  tab1  values(3000);
insert  into  tab1  values(4000);
insert  into  tab1  values(9999);
insert  into  tab1  values(9999);
commit;

 

반응형