SQL

조인 JOIN , 카운트 COUNT , 중복카운트 COUNT DISTINCT 예제

dev.mk 2020. 5. 4. 20:13
반응형

MySQL 기준 테이블 스크립트

CREATE TABLE mysql_test_a ( 
id INT(6UNSIGNED AUTO_INCREMENT PRIMARY KEY
firstname VARCHAR(30NOT NULL
lastname VARCHAR(30NOT NULL,  
email VARCHAR(50), 
rm1 VARCHAR(10),
rm2 VARCHAR(20),
reg_date TIMESTAMP 
); 
 
CREATE TABLE mysql_test_b ( 
id INT(6NOT NULL,
firstname VARCHAR(30NOT NULL
lastname VARCHAR(30NOT 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컬럼의 값이 모두 있는 것을 카운트한다.

 
select
    a.id
    , a.firstname
    , a.in_date
    , count(DISTINCT(
        case 
        when b.rm1 != '' and b.rm2 != ''
        then 1
        else 0
        end
    ) 
    ) 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    /*그룹의 기준 컬럼*/

 

반응형