매일 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;
'SQL 문제 풀기 > 2. SQLD 기출 : 2024.3.01~2024.4.25' 카테고리의 다른 글
<SQLD 39> 데이터 분석 함수에 대한 기출문제 (0) | 2024.04.08 |
---|---|
<SQLD 38> 조인에 대한 기출문제 (0) | 2024.04.07 |
<SQLD 36> 데이터 분석함수에 대한 기출문제 (0) | 2024.04.05 |
<SQLD 35> 그룹 함수에 대한 기출문제 (0) | 2024.04.04 |
<SQLD 34> 그룹 함수와 null 값에 대한 기출문제 (0) | 2024.04.03 |