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;
반응형
'SQL 문제 풀기 > 2. SQLD 기출 : 2024.3.01~2024.4.25' 카테고리의 다른 글
<SQLD 21> NULL 값에 대한 이해 (0) | 2024.03.21 |
---|---|
<SQLD 20>그룹함수 SUM에 대한 기출문제 (0) | 2024.03.20 |
<SQLD 18> AVG 함수에 대한 기출문제 (4) | 2024.03.18 |
<SQLD 17> LIKE 연산자에 대한 기출문제 (0) | 2024.03.17 |
<SQLD 16> 그룹함수 NULL값을 무시하는 것에 대한 기출문제 (0) | 2024.03.16 |