강의

멘토링

로드맵

인프런 커뮤니티 질문&답변

kokodae.ko님의 프로필 이미지
kokodae.ko

작성한 질문수

[2025] SQLD 문제가 어려운 당신을 위한 노랭이 176 문제 풀이

실전 모의고사 3회 해설

실전문제3회 41번문제

해결된 질문

작성

·

21

0

분기별 매출 실적과 전년 동기 대비 증감률 문제요

1번이나 3번이나 동일한 결과값 아닌가요?:

실제 두개값 minus하니까 일치하는걸로 나오던데요..

 

1번보기:

SELECT YEAR, QUARTER, AMOUNT,

LAG(AMOUNT) OVER (PARTITION BY QUARTER ORDER BY YEAR) as PREV_AMOUNT,

ROUND((AMOUNT - LAG(AMOUNT) OVER (PARTITION BY QUARTER ORDER BY YEAR)) /

LAG(AMOUNT) OVER (PARTITION BY QUARTER ORDER BY YEAR) * 100, 2) as GROWTH_RATE

from SALES;

 

3번보기:

SELECT YEAR, QUARTER, AMOUNT,

LAG(AMOUNT, 4) OVER (ORDER BY YEAR, QUARTER) as PREV_AMOUNT,

ROUND((AMOUNT - LAG(AMOUNT, 4) OVER (ORDER BY YEAR, QUARTER)) /

LAG(AMOUNT, 4) OVER (ORDER BY YEAR, QUARTER) * 100, 2) as GROWTH_RATE

FROM SALES;

답변 2

0

데이터코드랩님의 프로필 이미지
데이터코드랩
지식공유자

안녕하세요. kokodae.ko 님.

질문 남겨주셔서 감사합니다.

 

이 문제는 가장 적절한 sql 을 찾는 문제입니다. 말씀하신 것 처럼 보기 1, 3은 해당 데이터 내에서는 동일한 결과가 나옵니다. 하지만 3번 같은 경우, Lag 에 4 라는 값을 하드코딩 해두었기 때문에 데이터가 누락된 경우에는 완전히 잘 못된 값을 출력하게 됩니다. 예를 들어 한 개 쿼터의 값이 없는 경우에도 4개 이전의 값을 가지고 계산을 하게 됩니다.

 

그래서 가장 적절한 sql은 1번으로 선택하는 것이 좋습니다.

 

물론 실제시험에서도 이런 경우가 있을 수 있습니다.

실제로 제시된 데이터를 기준으로 정답을 선택하는 것이기 때문에 3번이 정답이라고 이의를 제기할 수 있습니다. (이런 경우가 종종 존재합니다) 이의를 제기해서 점수를 받을 수도 있겠지만 리스크 관리차원에서 1번 보기를 선택하는 게 더 좋을 것 같습니다.

 

아래, 참고하시라고 실습 스크립트를 남겨드립니다. 이미 실습을 해보신 것 같지만, 참고하십시오. 감사합니다.

 

 

-- SALES 테이블 생성

CREATE TABLE SALES (

YEAR INT,

QUARTER INT,

AMOUNT DECIMAL(10, 0)

);

-- 예시 데이터 삽입

INSERT INTO SALES (YEAR, QUARTER, AMOUNT) VALUES (2023, 1, 1000);

INSERT INTO SALES (YEAR, QUARTER, AMOUNT) VALUES (2023, 2, 1200);

INSERT INTO SALES (YEAR, QUARTER, AMOUNT) VALUES (2023, 3, 1500);

INSERT INTO SALES (YEAR, QUARTER, AMOUNT) VALUES (2023, 4, 1800);

INSERT INTO SALES (YEAR, QUARTER, AMOUNT) VALUES (2024, 1, 1300);

INSERT INTO SALES (YEAR, QUARTER, AMOUNT) VALUES (2024, 2, 1400);

-- 추가 데이터를 삽입하여 2024년 3분기/4분기 YoY 비교가 가능하도록 합니다.

INSERT INTO SALES (YEAR, QUARTER, AMOUNT) VALUES (2024, 3, 1700);

INSERT INTO SALES (YEAR, QUARTER, AMOUNT) VALUES (2024, 4, 2000);

commit;

-- 보기1

SELECT YEAR, QUARTER, AMOUNT,

LAG(AMOUNT) OVER (PARTITION BY QUARTER ORDER BY YEAR) as PREV_AMOUNT,

ROUND((AMOUNT - LAG(AMOUNT) OVER (PARTITION BY QUARTER ORDER BY YEAR)) /

LAG(AMOUNT) OVER (PARTITION BY QUARTER ORDER BY YEAR) * 100, 2) as GROWTH_RATE

FROM SALES;

-- 보기2

SELECT YEAR, QUARTER, AMOUNT,

LAG(AMOUNT) OVER (ORDER BY YEAR, QUARTER) as PREV_AMOUNT,

ROUND((AMOUNT - LAG(AMOUNT) OVER (ORDER BY YEAR, QUARTER)) /

LAG(AMOUNT) OVER (ORDER BY YEAR, QUARTER) * 100, 2) as GROWTH_RATE

FROM SALES;

-- 보기3

SELECT YEAR, QUARTER, AMOUNT,

LAG(AMOUNT, 4) OVER (ORDER BY YEAR, QUARTER) as PREV_AMOUNT,

ROUND((AMOUNT - LAG(AMOUNT, 4) OVER (ORDER BY YEAR, QUARTER)) /

LAG(AMOUNT, 4) OVER (ORDER BY YEAR, QUARTER) * 100, 2) as GROWTH_RATE

FROM SALES;

-- 보기4

SELECT YEAR, QUARTER, AMOUNT,

FIRST_VALUE(AMOUNT) OVER (PARTITION BY QUARTER ORDER BY YEAR) as PREV_AMOUNT,

ROUND((AMOUNT - FIRST_VALUE(AMOUNT) OVER (PARTITION BY QUARTER ORDER BY YEAR)) /

FIRST_VALUE(AMOUNT) OVER (PARTITION BY QUARTER ORDER BY YEAR) * 100, 2) as GROWTH_RATE

FROM SALES;

 

kokodae.ko님의 프로필 이미지
kokodae.ko
질문자

네...3번도 맞는데 하드코딩되어있길래 분기가 누락이 있으면 안될것 같아서 1번 선택했는데 답은 3번이라고 나와있고 해설도 3번이라고 되어있어서 이상해서 질문드렸습니다. 테스트할때는 누락없이 다 집어넣어봤구요....감사합니다.

데이터코드랩님의 프로필 이미지
데이터코드랩
지식공유자

아. 그랬군요. 제가 답지를 확인해보지 못했어요. 다시 확인해보겠습니다. 감사드립니다.

데이터코드랩님의 프로필 이미지
데이터코드랩
지식공유자

감사합니다. 답지 확인했구요. 1번으로 업데이트 해두었습니다.

0

안녕하세요, 인프런 AI 인턴입니다. kokodae.ko님.

SQL 쿼리에서 분기별 매출 실적과 전년 동기 대비 증감률을 계산하는 문제는 LAG 함수를 사용하는 방식에 따라 결과가 달라질 수 있습니다. 두 쿼리를 비교해 보겠습니다.

  1. 첫 번째 쿼리:

    • LAG(AMOUNT) OVER (PARTITION BY QUARTER ORDER BY YEAR) AS PREV_AMOUNT: 이 쿼리는 동일한 분기 내에서 바로 이전 해의 금액을 가져옵니다. 각 분기마다 별도로 나누어 계산합니다.
  2. 세 번째 쿼리:

    • LAG(AMOUNT, 4) OVER (ORDER BY YEAR, QUARTER) AS PREV_AMOUNT: 이 쿼리는 데이터를 전체적으로 주문하여 각 행이 데이터 세트에서 4번째 이전의 금액을 가져오도록 구성되어 있습니다. 이 방식은 실제로 1년 전 동일한 분기의 매출 데이터를 참조하게 됩니다.

결론적으로 두 쿼리의 의도는 다릅니다. 1번 쿼리는 각 분기 내에서 이전 해의 동일 분기를 참조하는 반면, 3번 쿼리는 전체 데이터를 기준으로 전년도 동일 분기를 참조하고 있습니다. 이 때문에 쿼리가 일치하지 않는 경우, 데이터나 쿼리에 착오가 있을 수 있으므로 다시 확인이 필요할 수 있습니다.

관련된 주제에 관하여 더 많은 정보를 원하신다면, SQL LAG 함수 활용 방법에 대한 기존의 답변을 참고하시면 도움이 될 것입니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

kokodae.ko님의 프로필 이미지
kokodae.ko

작성한 질문수

질문하기