강의

멘토링

커뮤니티

Cộng đồng Hỏi & Đáp của Inflearn

Hình ảnh hồ sơ của kokodaeko1738
kokodaeko1738

câu hỏi đã được viết

[2026] Giải 176 bài tập sách vàng dành cho bạn thấy đề thi SQLD khó

Giải đề thi thử thực chiến 3

실전문제3회 41번문제

Đã giải quyết

Viết

·

65

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;

sql빅데이터oraclemssqlSQLD

Câu trả lời 2

0

algolearn님의 프로필 이미지
algolearn
Người chia sẻ kiến thức

안녕하세요. 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;

 

kokodaeko1738님의 프로필 이미지
kokodaeko1738
Người đặt câu hỏi

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

algolearn님의 프로필 이미지
algolearn
Người chia sẻ kiến thức

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

algolearn님의 프로필 이미지
algolearn
Người chia sẻ kiến thức

감사합니다. 답지 확인했구요. 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 함수 활용 방법에 대한 기존의 답변을 참고하시면 도움이 될 것입니다.

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

Hình ảnh hồ sơ của kokodaeko1738
kokodaeko1738

câu hỏi đã được viết

Đặt câu hỏi