pbj0812의 코딩 일기

[SQL] RIGHT JOIN 과 UNION 을 이용한 빈 키 값 채우기 본문

ComputerLanguage_Program/SQL

[SQL] RIGHT JOIN 과 UNION 을 이용한 빈 키 값 채우기

pbj0812 2021. 9. 3. 02:08

0. 목표

 - RIGHT JOIN 과 UNION 을 이용한 빈 키 값 채우기

1. 실습

 1) 테이블 생성

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

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

 2) 데이터 삽입

INSERT INTO sql_test.full1(id, dated) VALUES(1, '2021-01-01 12:12:12');
INSERT INTO sql_test.full1(id, dated) VALUES(2, '2021-01-01 13:12:12');
INSERT INTO sql_test.full1(id, dated) VALUES(3, '2021-01-04 12:12:12');
INSERT INTO sql_test.full1(id, dated) VALUES(4, '2021-01-04 13:12:12');
INSERT INTO sql_test.full1(id, dated) VALUES(5, '2021-01-04 14:12:12');

INSERT INTO sql_test.full2(id, dated) VALUES(1, '2021-01-01 12:12:12');
INSERT INTO sql_test.full2(id, dated) VALUES(2, '2021-01-01 13:12:12');
INSERT INTO sql_test.full2(id, dated) VALUES(3, '2021-01-03 12:12:12');
INSERT INTO sql_test.full2(id, dated) VALUES(4, '2021-01-03 13:12:12');
INSERT INTO sql_test.full2(id, dated) VALUES(5, '2021-01-03 14:12:12');

  (1) full1

   - 1, 4 일 데이터만 들어가 있음

  (2) full2

    - 1, 3 일 데이터만 들어가 있음

 3) 연산

  - A 에서는 full1 를 날짜별로 연산

  - B 에서는 full2 를 날짜별로 연산

  - C 에서 UNION 으로 구분하여 LEFT JOIN 으로 A 의 날짜 기준으로 데이터를 만들고, RIGHT JOIN 으로 B 의 날짜 기준으로 데이터를 만들어 접합(UNION 을 쓰기 때문에 중복은 걸러짐)

  - 날짜 순으로 정렬

WITH A AS (
	SELECT
		DATE_FORMAT(dated, '%Y-%m-%d') AS dated,
        COUNT(*) AS CNT
	FROM sql_test.full1
    GROUP BY 1
),

B AS (
	SELECT
		DATE_FORMAT(dated, '%Y-%m-%d') AS dated,
        COUNT(*) AS CNT2
	FROM sql_test.full2
    GROUP BY 1
),

C AS (
	SELECT 
		A.dated,
		A.CNT,
		IFNULL(B.CNT2, 0) CNT2
	FROM A 
	LEFT JOIN B 
	ON A.dated = B.dated

	UNION

	SELECT 
		B.dated,
		IFNULL(A.CNT, 0) AS CNT,
		B.CNT2
	FROM A 
	RIGHT JOIN B 
	ON A.dated = B.dated
)

SELECT * FROM C ORDER BY dated ASC;

Comments