ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 조인 JOIN , 카운트 COUNT , 중복카운트 COUNT DISTINCT 예제
    SQL 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    /*그룹의 기준 컬럼*/

     

    반응형

    댓글

Designed by Tistory.