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

<SQLD 37> 기타 비교연산자 대한 기출문제

by HYEHYE_SON 2024. 4. 6.
728x90

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


 


문제 37.

다음의 테이블을 보고 실행한 SQL문 중에서 그 결과가 올바르지 않은 것은?  

 

[ t_order 테이블 ]

Orderyear Ordermonth Price
2020 01 1000
2020 02 6000
2020 03 2000
2020 04 3000
2020 05 2000
2020 06 1500

 


① 

SELECT SUM(price) AS TOTAL
    FROM t_order 
    WHERE orderyear BETWEEN '2020' AND '2021' 
    AND ordermonth BETWEEN '01' AND '12';
    
# 결과 : 15,500


② 

SELECT SUM(price) AS TOTAL
    FROM t_order 
    WHERE ordermonth in ('01','06');
    
# 결과 : 2,500

 


③ 

SELECT SUM(price) AS TOTAL
    FROM t_order 
    WHERE ordermonth = '01' or ordermonth = '06';
    
# 결과 : 2,500

 


SELECT SUM(decode('06', 0, price)) AS TOTAL
    FROM t_order
    WHERE orderyear BETWEEN '2020' AND '2021';
    
# 결과 : 1,500

 


해설해보기

< 1번 >

t_order 테이블에서 price의 총합을 구하는데, 

orderyear 컬럼의 값이 '2020'과 '2021' 사이이며

ordermonth 컬럼의 값이 '01'과 '12' 사이의 값인 행들에 대해서만 총합을 구하는 쿼리입니다. 

 

테이블의 모든 행이 조건에 부합하므로 price의 모든 값을 더해주면 됩니다. 

 

따라서1000 + 6000 + 2000 + 3000 + 2000 + 1500 = 15,500

SELECT SUM(price) AS TOTAL
    FROM t_order 
    WHERE orderyear BETWEEN '2020' AND '2021' 
    AND ordermonth BETWEEN '01' AND '12';

 

 

< 2번 >

t_order 테이블에서 price의 총합을 구하는데,

ordermonth 컬럼의 값이 01이거나 06인 행의 price 에 대해서만 총합을 구하는 쿼리입니다. 

 

따라서 최종결과는 

1000 + 1500 = 2500 

SELECT SUM(price) AS TOTAL
    FROM t_order 
    WHERE ordermonth in ('01','06');

 

 

< 3번 >

t_order 테이블에서 price의 총합을 구하는데,

ordermonth가 '01'이거나 ordermonth가 '06'인 price에 대해서만 총합을 구하는 쿼리입니다.

 

즉 2번의 in 연산자를 사용한 것과 동일한 결과를 얻는 쿼리입니다.

SELECT SUM(price) AS TOTAL
    FROM t_order 
    WHERE ordermonth = '01' or ordermonth = '06';

 

 

< 4번 >

t_order 테이블에서 총합을 구하는데, 

orderyear 컬럼의 값이 '2020'과 '2021' 사이에 있는 행들에 대해서만 총합을 구하도록 합니다. 

단, 검색할 때 decode 함수를 사용합니다.

 

 ■ DECODE() 함수 

특정 조건에 따라 다른 값을 반환할 수 있게 해주는 함수


DECODE( 비교할 컬럼 또는 표현식, 비교할 값, 일치할 때 출력할 값, 기본값)
DECODE( 비교할 컬럼 또는 표현식, 비교할 값1, 비교할 값1이 일치할 때 출력할 값, 비교할 값2, 값2가 일치할 때 출력할 값 , ..., 기본값)

 

문법은 위와 같습니다. 

따라서 제시된 쿼리를보면

 

DECODE( '06', 0, price ) 

 

첫번째 인자인 06과 두번째 인자인 0이 일치하는지 비교합니다.

두 값이 일치하면 price를 반환하는데, 일치하지 않으므로 기본값을 반환합니다.

여기서 기본값은 지정해주지 않았기 때문에 기본값 NULL을 반환합니다. 

 

결과적으로 이 표현식은 항상 NULL을 반환합니다. 

때문에 항상 NULL을 합산하려고 시도합니다. 

 

SELECT SUM(decode('06', 0, price)) AS TOTAL
    FROM t_order
    WHERE orderyear BETWEEN '2020' AND '2021';

 

 

 

정답

이 문제의 정답은 항상 NULL을 반환하게 되는 ④ 입니다.


관련 스크립트

CREATE TABLE t_order (
    OrderYear INT,
    OrderMonth INT,
    Price INT
);

INSERT INTO t_order (OrderYear, OrderMonth, Price) VALUES (2020, 01, 1000);
INSERT INTO t_order (OrderYear, OrderMonth, Price) VALUES (2020, 02, 6000);
INSERT INTO t_order (OrderYear, OrderMonth, Price) VALUES (2020, 03, 2000);
INSERT INTO t_order (OrderYear, OrderMonth, Price) VALUES (2020, 04, 3000);
INSERT INTO t_order (OrderYear, OrderMonth, Price) VALUES (2020, 05, 2000);
INSERT INTO t_order (OrderYear, OrderMonth, Price) VALUES (2020, 06, 1500);

commit;

 
 
 
 
 
 
 
 
 
 

반응형