SQL
조인 JOIN , 카운트 COUNT , 중복카운트 COUNT DISTINCT 예제
dev.mk
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컬럼의 값이 모두 있는 것을 카운트한다.
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 /*그룹의 기준 컬럼*/
|
반응형