해결된 질문
작성
·
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;
0
안녕하세요, 인프런 AI 인턴입니다. kokodae.ko님.
SQL 쿼리에서 분기별 매출 실적과 전년 동기 대비 증감률을 계산하는 문제는 LAG
함수를 사용하는 방식에 따라 결과가 달라질 수 있습니다. 두 쿼리를 비교해 보겠습니다.
첫 번째 쿼리:
LAG(AMOUNT) OVER (PARTITION BY QUARTER ORDER BY YEAR) AS PREV_AMOUNT
: 이 쿼리는 동일한 분기 내에서 바로 이전 해의 금액을 가져옵니다. 각 분기마다 별도로 나누어 계산합니다.세 번째 쿼리:
LAG(AMOUNT, 4) OVER (ORDER BY YEAR, QUARTER) AS PREV_AMOUNT
: 이 쿼리는 데이터를 전체적으로 주문하여 각 행이 데이터 세트에서 4번째 이전의 금액을 가져오도록 구성되어 있습니다. 이 방식은 실제로 1년 전 동일한 분기의 매출 데이터를 참조하게 됩니다.결론적으로 두 쿼리의 의도는 다릅니다. 1번 쿼리는 각 분기 내에서 이전 해의 동일 분기를 참조하는 반면, 3번 쿼리는 전체 데이터를 기준으로 전년도 동일 분기를 참조하고 있습니다. 이 때문에 쿼리가 일치하지 않는 경우, 데이터나 쿼리에 착오가 있을 수 있으므로 다시 확인이 필요할 수 있습니다.
관련된 주제에 관하여 더 많은 정보를 원하신다면, SQL LAG 함수 활용 방법에 대한 기존의 답변을 참고하시면 도움이 될 것입니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
네...3번도 맞는데 하드코딩되어있길래 분기가 누락이 있으면 안될것 같아서 1번 선택했는데 답은 3번이라고 나와있고 해설도 3번이라고 되어있어서 이상해서 질문드렸습니다. 테스트할때는 누락없이 다 집어넣어봤구요....감사합니다.