포스팅 목차
138. Count the no of employees who are working as manager (use set operation)?
* 관리자 역할을 수행하고 있는 직원들의 수를 카운트하시오.
- 파이썬 & R 패키지 호출 및 예제 데이터 생성 링크
- 서브쿼리 유사문제 : 86번 / 137번 / 111번 / 120번(Merge 방식 포함) / 128번(Unique구문 추가)
- [데이터 추출] 특정 조건을 만족하는 데이터 추출 - 비상관 서브쿼리(In), 관측치 갯수
- 데이터 전처리 -SQL, Pandas, R Prog, Dplyr, Dfply, SQLDF, PANDASQL, DATA.TABLE, SAS, Proc Sql
|
1. Oracle(오라클)
서브쿼리를 통하여 emp테이블의 관리자 사원번호(‘mgr’)에 명단이 존재하는 사원번호(‘empno’)를 카운트한다.
Oracle Programming |
select count(*) emp_cnt
from emp
where empno in (select mgr from emp);
집합연산자(SET 연산자) 중 하나인 교집합(intersect OPERATOR)를 사용하여서 emp테이블의 사원번호(empno)와 관리자 사원번호(mgr)에 동일하게 존재하는 사원번호를 선택 후 선택된 사원들의 수를 집계한다.
Oracle Programming |
select count(*) emp_cnt
from ( select empno from emp
intersect
select mgr from emp )
2. Python Pandas(파이썬)
isin 함수를 사용하여 emp테이블의 관리자 사원번호(‘mgr’)에 명단이 존재하는 사원번호(‘empno’)를 선택 후 사원들의 수를 카운트한다.
Python Programming |
emp[ emp['empno'].isin(emp['mgr']) ]['empno'].count()
Results |
6
3. R Programming (R Package)
%in% 함수를 사용하여 emp테이블의 관리자 사원번호(‘mgr’)에 명단이 존재하는 사원번호(‘empno’)를 선택 후 사원들의 수를 카운트한다.
R Programming |
%%R
count(emp[ emp$empno %in% unlist(emp$mgr) , ])
Results |
# A tibble: 1 x 1
n
<int>
1 6
4. R Dplyr Package
%in% 함수를 사용하여 emp테이블의 관리자 사원번호(‘mgr’)에 명단이 존재하는 사원번호(‘empno’)를 filter 함수로 선택 후 summarize() 함수를 통하여 선택된 사원들의 수를 카운트한다.
R Programming |
%%R
emp %>%
dplyr::filter( empno %in% ( emp %>% dplyr::select(mgr) %>% unlist() ) ) %>%
summarize( emp_cnt = n_distinct(empno,na.rm = TRUE))
Results |
# A tibble: 1 x 1
emp_cnt
<int>
1 6
5. R sqldf Package
서브쿼리를 통하여 emp테이블의 관리자 사원번호(‘mgr’)에 명단이 존재하는 사원번호(‘empno’)를 선택 후 선태된 사원들의 수를 카운트한다.
R Programming |
%%R
sqldf(" select count(*) emp_cnt
from emp
where empno in (select mgr from emp);")
Results |
emp_cnt
1 6
집합연산자(SET 연산자) 중 하나인 교집합(intersect OPERATOR)를 사용하여서 emp테이블의 사원번호(empno)와 관리자 사원번호(mgr)에 동일하게 존재하는 사원번호를 선택 후 선택된 사원들의 수를 집계한다.
R Programming |
%%R
sqldf(" select count(*) emp_cnt
from ( select empno from emp
intersect
select mgr from emp )" )
Results |
emp_cnt
1 6
6. Python pandasql Package
집합연산자(SET 연산자) 중 하나인 교집합(intersect OPERATOR)를 사용하여서 emp테이블의 사원번호(empno)와 관리자 사원번호(mgr)에 동일하게 존재하는 사원번호를 선택 후 선택된 사원들의 수를 집계한다.
Python Programming |
ps.sqldf(" select count(*) emp_cnt \
from ( select empno from emp \
intersect \
select mgr from emp )")
Results |
emp_cnt | |
0 | 6 |
7. R data.table Package
%in% 함수를 통하여 emp테이블의 관리자 사원번호(‘mgr’)에 명단이 존재하는 사원번호(‘empno’)를 선택 후 선택된 사원들의 급여 총합계와 사원들의 수를 집계한다.
R Programming |
%%R
DT <- data.table(emp)
dept_DT <- data.table(dept)
salgrade_DT <- data.table(salgrade)
DT[ empno %in% DT[,mgr],.(total=sum(empno), n=length(empno))]
Results |
total n
1: 46575 6
8. SAS Proc SQL
서브쿼리를 통하여 emp테이블의 관리자 사원번호(‘mgr’)에 명단이 존재하는 사원번호(‘empno’)를 카운트한다.
SAS Programming |
%%SAS sas
PROC SQL;
create table STATSAS_1 as
select count(*) AS MGR_CNT
from emp
where empno in (select mgr from emp);
QUIT;
PROC PRINT;RUN;
Results |
OBS | MGR_CNT |
1 | 6 |
집합연산자(SET 연산자) 중 하나인 교집합(intersect OPERATOR)를 사용하여서 emp테이블의 사원번호(empno)와 관리자 사원번호(mgr)에 동일하게 존재하는 사원번호를 선택 후 선택된 사원들의 수를 집계한다.
SAS Programming |
%%SAS sas
PROC SQL;
create table STATSAS_2 as
select count(*) AS MGR_CNT
from ( select empno from emp
intersect
select mgr from emp );
QUIT;
PROC PRINT;RUN;
Results |
OBS | MGR_CNT |
1 | 6 |
9. SAS Data Step
SAS Programming |
%%SAS sas
PROC SORT DATA=EMP OUT=EMP_1(RENAME=EMPNO=JOIN_KEY);
BY EMPNO;
RUN;
PROC SORT DATA = EMP OUT=EMP_DUP(RENAME=MGR=JOIN_KEY) NODUPKEY;
BY MGR;
RUN;
DATA STATSAS_2;
MERGE EMP_1(IN=A) EMP_DUP(IN=B);
BY JOIN_KEY;
IF A AND B;
RUN;
PROC SUMMARY DATA=STATSAS_2;
VAR EMPNO;
OUTPUT OUT=MGR_CNT(DROP=_:) N=MGR_CNT;
quit;
PROC PRINT;RUN;
Results |
OBS | MGR_CNT |
1 | 6 |
10. R dtplyr Package
%in% 함수를 사용하여 emp테이블의 관리자 사원번호(‘mgr’)에 명단이 존재하는 사원번호(‘empno’)를 filter() 함수로 선택 후 summarize() 함수를 통하여 선택된 사원들의 수를 집계한다.
R Programming |
%%R
# library(dplyr, warn.conflicts = FALSE)
lazy_emp <- lazy_dt(emp)
lazy_emp %>%
filter( empno %in% ( lazy_emp %>% select(mgr) %>% as_tibble() %>% unlist() ) ) %>%
summarize( emp_count = n() )
Results |
Source: local data table [?? x 1]
Call: `_DT2`[empno %in% (lazy_emp %>% select(mgr) %>% as_tibble() %>%
unlist()), .(emp_count = .N)]
emp_count
<int>
1 6
# Use as.data.table()/as.data.frame()/as_tibble() to access results
11. R tidytable Package
%in% 함수를 사용하여 emp테이블의 관리자 사원번호(‘mgr’)에 명단이 존재하는 사원번호(‘empno’)를 filter() 함수로 선택 후 count() 함수를 통하여 선택된 사원들의 수를 집계한다.
R Programming |
%%R
DT <- data.table(emp)
DT %>%
tidytable::filter.(empno %in% ( DT %>% select.(mgr) %>% unlist() )) %>%
count.()
Results |
# tidytable [6 x 8]
empno ename job mgr hiredate sal comm deptno
<dbl> <chr> <chr> <dbl> <date> <dbl> <dbl> <dbl>
1 7566 JONES MANAGER 7839 1981-04-02 2975 NA 20
2 7698 BLAKE MANAGER 7839 1981-03-01 2850 NA 30
3 7782 CLARK MANAGER 7839 1981-01-09 2450 NA 10
4 7788 SCOTT ANALYST 7566 1982-12-09 3000 NA 20
5 7839 KING PRESIDENT NA 1981-11-17 5000 NA 10
6 7902 FORD ANALYST 7566 1981-12-03 3000 NA 20
12. Python dfply Package(파이썬)
isin 함수를 사용하여 emp테이블의 관리자 사원번호(‘mgr’)에 명단이 존재하는 사원번호(‘empno’)를 filter_by 함수로 선택 후 summarize() 함수를 통하여 선택된 사원들의 수를 카운트한다.
Python Programming |
emp >> \
filter_by( X.empno.isin( (emp >> select(X.mgr))['mgr'] )) >>\
summarize(emp_count = n(X.empno))
Results |
emp_count | |
0 | 6 |
Python Programming |
# [참고] 함수 사용. (52번 예제 참고) : AttributeError: 'DataFrame' object has no attribute 'ix'
@pipe
def pull_list(df, column=-1):
return df.loc[:, column]
emp >> \
filter_by( X.empno.isin( emp >> select(X.mgr) >> pull_list("mgr"))) >> \
summarize( emp_cnt = X.empno.count())
Results |
emp_cnt | |
0 | 6 |
[SQL, Pandas, R Prog, Dplyr, SQLDF, PANDASQL, DATA.TABLE] SQL EMP 예제로 만나는 테이블 데이터 전처리 방법 리스트
댓글