pbj0812의 코딩 일기

[SQL] 전월 대비 실적 파악하기 본문

ComputerLanguage_Program/SQL

[SQL] 전월 대비 실적 파악하기

pbj0812 2021. 12. 15. 00:04

0. 목표

 - 전월 대비 실적 파악하기

1. 실습

 1) 테이블 생성

CREATE TABLE sql_test.full_test
(
	id int,
    amount int,
    dated datetime
);

 2) 데이터 삽입

INSERT INTO sql_test.full_test(id, amount, dated) VALUES(1, 100, '2021-11-12 12:12:12');
INSERT INTO sql_test.full_test(id, amount, dated) VALUES(1, 1000, '2021-11-12 12:12:12');
INSERT INTO sql_test.full_test(id, amount, dated) VALUES(3, 1000, '2021-11-12 12:12:12');
INSERT INTO sql_test.full_test(id, amount, dated) VALUES(4, 3000, '2021-11-12 12:12:12');
INSERT INTO sql_test.full_test(id, amount, dated) VALUES(1, 3000, '2021-12-12 12:12:12');
INSERT INTO sql_test.full_test(id, amount, dated) VALUES(2, 2000, '2021-12-12 12:12:12');
INSERT INTO sql_test.full_test(id, amount, dated) VALUES(2, 1000, '2021-12-12 12:12:12');
INSERT INTO sql_test.full_test(id, amount, dated) VALUES(4, 1000, '2021-12-12 12:12:12');

 3) 데이터 확인

 4) 쿼리 작성

-- id 기준으로 묶고 11월, 12월 데이터끼리만 모아서 더하기
-- 11월 혹은 12월 데이터가 없는 것들이 있을수도 있기에 ifnull 처리
WITH A AS (
	SELECT
		id,
		IFNULL(SUM(CASE WHEN MONTH(dated) = 11 THEN amount END), 0) AS amount11,
		IFNULL(SUM(CASE WHEN MONTH(dated) = 12 THEN amount END), 0) AS amount12
	FROM sql_test.full_test
	GROUP BY 1
),

-- 0의 유무 / 위치에 따라 입점 / 퇴점 / 유지 지정
B AS (
	SELECT 
		id,
		amount11,
		amount12,
		amount12 - amount11 as diff,
		CASE 
			WHEN amount11 = 0 THEN '입점'
			WHEN amount12 = 0 THEN '퇴점'
			ELSE '유지'
		END AS p_status
	FROM A
)

-- 유지인 것만 전월 대비 증감 퍼센트 계산
SELECT 
	id,
    amount11,
    amount12,
    diff,
    p_status,
    IF(p_status = '유지', ROUND((amount12 - amount11) / amount11 * 100, 2), '') AS percent    
FROM B
ORDER BY 1 ASC;

Comments