-
조인 JOIN , 카운트 COUNT , 중복카운트 COUNT DISTINCT 예제SQL 2020. 5. 4. 20:13반응형
MySQL 기준 테이블 스크립트
CREATE TABLE mysql_test_a (id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,firstname VARCHAR(30) NOT NULL,lastname VARCHAR(30) NOT NULL,email VARCHAR(50),rm1 VARCHAR(10),rm2 VARCHAR(20),reg_date TIMESTAMP);CREATE TABLE mysql_test_b (id INT(6) NOT NULL,firstname VARCHAR(30) NOT NULL,lastname VARCHAR(30) NOT NULL,email VARCHAR(50),reg_date TIMESTAMP,in_date varchar(12));INSERT INTO `mysql_test_a` (`id`, `firstname`, `lastname`, `email`,`rm1`,`rm2`, `reg_date`) VALUES ('1', 'John', 'Doe', 'john.doe@sqltest.net', 'etc1','etc2', CURRENT_TIMESTAMP);INSERT INTO `mysql_test_a` (`id`, `firstname`, `lastname`, `email`, `reg_date`) VALUES ('2', 'Park', 'Da', '34.doe@sqltest.net' , CURRENT_TIMESTAMP);INSERT INTO `mysql_test_a` (`id`, `firstname`, `lastname`, `email`,`rm1`,`rm2`, `reg_date`) VALUES ('3', 'Lee', 'Gh', '12.42@sqltest.net', 'etc1','etc2', CURRENT_TIMESTAMP);INSERT INTO `mysql_test_a` (`id`, `firstname`, `lastname`, `email`, `reg_date`) VALUES ('4', 'Kim', 'Wq', '45.6@sqltest.net', CURRENT_TIMESTAMP);INSERT INTO `mysql_test_a` (`id`, `firstname`, `lastname`, `email`, `reg_date`) VALUES ('5', 'Yoon', 'Xa', 'gf.doe@sqltest.net', CURRENT_TIMESTAMP);INSERT INTO `mysql_test_a` (`id`, `firstname`, `lastname`, `email`, `reg_date`) VALUES ('6', 'Ma', 'Ha', 'df.doe@sqltest.net', CURRENT_TIMESTAMP);INSERT INTO `mysql_test_a` (`id`, `firstname`, `lastname`, `email`, `reg_date`) VALUES ('7', 'Shin', 'Wq', 'gf.doe@sqltest.net', CURRENT_TIMESTAMP);INSERT INTO `mysql_test_a` (`id`, `firstname`, `lastname`, `email`, `reg_date`) VALUES ('8', 'Joo', 'Ty', 'hhh.doe@sqltest.net', CURRENT_TIMESTAMP);INSERT INTO `mysql_test_a` (`id`, `firstname`, `lastname`, `email`, `reg_date`) VALUES ('9', 'Ha', 'As', 'asd.doe@sqltest.net', CURRENT_TIMESTAMP);INSERT INTO `mysql_test_b` (`id`, `firstname`, `lastname`, `email`, `reg_date`,`in_date`) VALUES ('1', 'Left', 'Join', 'john.doe@sqltest.net', CURRENT_TIMESTAMP,'202005');INSERT INTO `mysql_test_b` (`id`, `firstname`, `lastname`, `email`, `reg_date`,`in_date`) VALUES ('2', 'Right', 'Join', '34.doe@sqltest.net', CURRENT_TIMESTAMP,'202005');INSERT INTO `mysql_test_b` (`id`, `firstname`, `lastname`, `email`, `reg_date`,`in_date`) VALUES ('3', 'Full', 'Join', '12.42@sqltest.net', CURRENT_TIMESTAMP,'202006');INSERT INTO `mysql_test_b` (`id`, `firstname`, `lastname`, `email`, `reg_date`,`in_date`) VALUES ('2', 'Right', 'Join', '34.doe@sqltest.net', CURRENT_TIMESTAMP,'202005');INSERT INTO `mysql_test_b` (`id`, `firstname`, `lastname`, `email`, `reg_date`,`in_date`) VALUES ('3', 'Cross', 'Test', '12.42@sqltest.net', CURRENT_TIMESTAMP,'202007');INSERT INTO `mysql_test_b` (`id`, `firstname`, `lastname`, `email`, `reg_date`,`in_date`) VALUES ('3', 'Inner', 'Zzz', '34.doe@sqltest.net', CURRENT_TIMESTAMP,'202005');INSERT INTO `mysql_test_b` (`id`, `firstname`, `lastname`, `email`, `reg_date`,`in_date`) VALUES ('3', 'Scal', 'Yyy', '12.42@sqltest.net', CURRENT_TIMESTAMP,'202005');mysql_test_a /*부모테이블*/
mysql_test_b /*자식테이블*/
1. 년월(in_date) 기준으로 자식테이블의 월별 갯수를 구한다.
2. 년월(in_date) 기준으로 부모테이블의 id갯수를 카운트 한다. (중복불가)
3. 부모테이블의 rm1, rm2컬럼의 값이 모두 있는 것을 카운트한다.
selecta.id, a.firstname, a.in_date, count(DISTINCT(casewhen b.rm1 != '' and b.rm2 != ''then 1else 0end)) as rm_cnt /* 부모테이블의 rm1,rm2의 값이 모두 있는 로우를 중복제거하고 카운팅 */, count(*) cnt /*in_date 컬럼의 카운팅 */, count(DISTINCT a.id) as id_cnt /* 부모테이블의 id의 중복을 제거하고 부모의 id를 카운팅*/from mysql_test_b a /*조인의 기준테이블은 자식테이블 */left outer join mysql_test_a b /*innerjon 이나 left outer join의 결과수는 같다. */on a.id = b.id /*키의 조인*/where a.in_date = '202005' /*조회 기준년월 */group by a.in_date /*그룹의 기준 컬럼*/반응형'SQL' 카테고리의 다른 글
[오라클] 1:1 질문과 답변 게시판 SQL 정리 (0) 2023.09.30 MYSQL, MARIA 테스트 데이터 넣기 (0) 2020.07.27 MYSQL D-DAY 디데이 계산하기 (0) 2020.04.17 스칼라 서브쿼리(Scala Subquery)란 ? (0) 2020.04.05 이퀴조인 (EQUI JOIN) 아우터 조인(Outer Join) (0) 2020.04.05