문제54. 부서번호, 부서번호별 최대월급을 출력해주세요.
-- SQL
select deptno, max(sal)
from emp
group by deptno;
# R
emp <- read.csv("c:\\data\\emp3.csv")
x <- aggregate(sal~job, emp, max)
names(x) <- c("job", "sumsal")
x
aggregate(값을 뽑을 컬럼명 ~ 그룹핑할 컬럼명, 테이블명, 그룹함수)
# python
x = emp.groupby('job')['sal'].max().reset_index()
x.columns = ['job','maxsal']
x
df.groupby('그룹핑할 컬럼명')['값 컬럼명'].그룹함수.reset_index()
# reset_index() : 데이터 프레임으로 변환하는 함수
문제55. 부서번호, 부서번호별 토탈월급을 출력하시오.
-- SQL
select deptno, sum(sal)
from emp
group by deptno;
# R
emp <- read.csv("c:\\data\\emp3.csv")
x <- aggregate(sal~deptno, emp, sum)
names(x) <- c("deptno", "sumsal") # names()로 컬럼명변경
x
# python
result = emp.groupby('deptno')['sal'].sum().reset_index()
result.columns = ['deptno', 'sumsal']
result
문제56. 위의 결과를 다시 출력하는데 토탈월급이 높은것부터 출력하시오.
-- SQL
select deptno, sum(sal)
from emp
group by deptno
order by 2 desc;
# R
emp <- read.csv("c:\\data\\emp3.csv")
x <- aggregate(sal~deptno, emp, sum)
names(x) <- c("deptno", "sumsal")
library(doBy) # doBy 패키지 라이브러리
orderBy(~ -sumsal, x) # desc로 정렬
# python
result = emp.groupby('deptno')['sal'].sum().reset_index()
result.columns = ['deptno', 'sumsal']
result.sort_values(by= 'sumsal', ascending = False)
문제57. 직업, 직업별 인원수를 출력하시오.
# R
x <- aggregate(ename~job, emp, length)
names(x) <- c("job", "count")
x
# python
result = emp.groupby('job')['ename'].count().reset_index()
result.columns = ['job', 'count']
result
-- SQL
select job, count(job)
from emp
group by job;
문제58. 위의 결과를 다시 출력하는데 인원수가 높은 것부터 출력하시오.
-- SQL
select job, count(job)
from emp
group by job
order by 2 desc;
# R
emp <- read.csv("c:\\data\\emp3.csv")
x <- aggregate(ename~job, emp, length)
names(x) <- c("job", "count")
library(doBy)
orderBy(~ -count, x)
# python
result = emp.groupby('job')['ename'].count().reset_index()
result.columns = ['job', 'count']
result.sort_values('count', ascending = False)
문제59. 직업, 직업별 토탈월급을 출력하는데, 직업별 토탈월급이 5000 이상인 것만 출력하시오.
-- SQL
select job, sum(sal)
from emp
group by job
having sum(sal) >= 5000;
# R
emp <- read.csv("c:\\data\\emp3.csv")
x <- aggregate(sal~job, emp, sum)
names(x) <- c("job", "sumsal")
x[x$sumsal >= 5000, c("job", "sumsal")]
# python
a = emp.groupby('job')['sal'].sum().reset_index()
a.columns = ['job', 'sumsal']
a[:][a.sumsal >= 5000]
문제60. 직업과 직업별 토탈월급을 출력하는데 직업별 토탈월급이 5000 이상인 것만 출력하고 직업별 토탈월급을 높은 것부터 출력하시오.
-- SQL
select job, sum(sal)
from emp
group by job
having sum(sal) >= 5000
order by 2 desc;
# R
emp <- read.csv("c:\\data\\emp3.csv")
x <- aggregate(sal~job, emp, sum)
names(x) <- c("job", "sumsal")
x_sum = x[x$sumsal >= 5000, c("job", "sumsal")]
library(doBy)
orderBy(~ -sumsal, x_sum)
# python
a = emp.groupby('job')['sal'].sum().reset_index()
a.columns = ['job', 'sumsal']
a[:][a.sumsal >= 5000].sort_values('sumsal', ascending = False)
문제61. 직업과 직업별 토탈월급을 출력하는데 직업이 SALESMAN은 제외하고 출력하고 직업별 토탈월급이 5000 이상인 것만, 직업별 토탈월급이 높은 것부터 출력하시오.
-- SQL
select job, sum(sal)
from emp
where job != 'SALESMAN'
group by job
having sum(sal) >= 5000
order by 2 desc;
# R
emp <- read.csv("c:\\data\\emp3.csv")
x <- aggregate(sal~job, emp, sum)
names(x) <- c("job", "sumsal")
x2 = x[(x$sumsal >= 5000) & (x$job != 'SALESMAN'), c("job", "sumsal")]
library(doBy)
orderBy(~ -sumsal, x2)
# python
a = emp.groupby('job')['sal'].sum().reset_index()
a.columns = ['job', 'sumsal']
a[:][(a.sumsal >= 5000) & (a.job != 'SALESMAN')].sort_values('sumsal', ascending = False)
문제62. 아래의 SQL을 R과 파이썬으로 구현하시오.
-- SQL
select deptno, job, sum(sal)
from emp
group by deptno, job
order by deptno, job;
# R
emp <- read.csv("c:\\data\\emp3.csv")
x <- aggregate(sal~ deptno+job, emp, sum)
names(x) <- c("deptno","job", "sumsal")
library(doBy)
orderBy(~ deptno, x)
# python
a = emp.groupby(['deptno', 'job'])['sal'].sum().reset_index()
a
문제63. 사원 테이블에서 입사한 년도를 4자리로 출력하시오.
-- SQL
select to_char(hiredate, 'RRRR')
from emp;
# R
library(data.table)
data.table( 입사연도 = format(as.Date(emp$hiredate),'%Y') )
# python
emp['hiredate'] = pd.to_datetime(emp['hiredate']) # object을 날짜형으로 변경
emp.info() # 컬럼이 날짜형으로 변경되었는지 확인
5 hiredate 14 non-null datetime64[ns] <- 날짜형으로 바뀜
emp['hiredate'].dt.year # 시리즈의 dt함수를 써서 연도 4자리 출력
문제64. 아래의 SQL을 R과 판다스로 구현하시오
-- SQL
select to_char(hiredate, 'RRRR'), deptno, sum(sal)
from emp
group by to_char(hiredate, 'RRRR'), deptno;
# R
library(data.table)
emp$hire_year = format(as.Date(emp$hiredate),'%Y')
x <- aggregate(sal ~ hire_year+deptno, emp, sum)
library(doBy)
orderBy(~ hire_year, x)
# python
emp['hiredate'] = pd.to_datetime(emp['hiredate'])
emp['hire_year'] = emp['hiredate'].dt.year
a = emp.groupby(['hire_year','deptno'])['sal'].sum().reset_index()
a.sort_values('hire_year', ascending = True)
문제65. 아래의 SQL을 R과 파이썬으로 수행하세요. (pivot)
-- SQL
select *
from ( select deptno, sal from emp )
pivot ( sum(sal) for deptno in (10,20,30) );
# R
tapply(emp$sal, emp$deptno, sum)
tapply( 계산할 값 컬럼, 그룹핑할 컬럼, 적용 함수)
# python
x = emp.pivot_table(columns = 'deptno', aggfunc = 'sum')
x[5:] # 슬라이싱 할 수도 있고
# x.iloc[[5], ] iloc[[선택할 행번호],열번호] 가져와도 됨
문제66. (점심시간 문제) 직업, 직업별 인원수를 아래와 같이 가로로 출력하시오.
-- SQL
select *
from ( select job, empno from emp)
pivot( count(empno) for job in ('ANALYST','CLERK','MANAGER','SALESMAN','PRESIDENT') );
# R
tapply(emp$empno,emp$job, length)
# 또는
table(emp$job)
table( count하고 싶은 컬럼 )
# python
x = emp.pivot_table(columns = 'job', aggfunc = 'count') # 가로로 애초에 돌려서 검색함
x2 = x.iloc[[0], ]
x2.index = ['cnt']
x2
# 또는
x = emp.groupby('job')['empno'].count().reset_index() # 데이터 검색을 먼저 한 다음에
x.columns = ['job','cnt']
x.pivot_table(columns = 'job') # 세로로 출력된 것을 가로로 돌림
문제67. 판다스에서 부서번호, 부서번호별 토탈월급을 가로로 출력하시오.
x = emp.groupby('deptno')['sal'].sum().reset_index()
x.columns = ['deptno', 'sumsal']
x.pivot_table(columns = 'deptno')
문제68. 입사한 연도, 입사한 연도별 토탈월급을 출력하시오.(세로로)
-- SQL
select to_char(hiredate, 'RRRR') as year, sum(sal)
from emp
group by to_char(hiredate,'RRRR');
# R
emp$hire_year = format(as.Date(emp$hiredate),'%Y')
aggregate( sal ~ hire_year, emp, sum) # 세로
# python
x = emp.groupby('hire_year')['sal'].sum().reset_index()
x.columns = ['hire_year', 'sumsal']
x
문제69. 입사년도, 입사년도별 토탈월급을 출력하는데 가로로 출력하시오.
-- SQL
select *
from (
select to_char(hiredate, 'RRRR') as year, sal
from emp )
pivot ( sum(sal) for year in ( 1980,1981,1982,1983 ) );
-- 또는 sum+decode 이용해서 할 수도 있음.
select sum(decode(to_char(hiredate,'RRRR'), '1980',sal,0)) as "1980",
sum(decode(to_char(hiredate,'RRRR'), '1981',sal,0)) as "1981",
sum(decode(to_char(hiredate,'RRRR'), '1982',sal,0)) as "1982",
sum(decode(to_char(hiredate,'RRRR'), '1983',sal,0)) as "1983"
from emp;
# R
emp$hire_year = format(as.Date(emp$hiredate),'%Y')
tapply(emp$sal, emp$hire_year, sum)
# python
emp['hire_year'] = pd.to_datetime(emp['hiredate']).dt.year
x = emp.groupby('hire_year')['sal'].sum().reset_index()
x.columns = ['hire_year', 'sumsal']
x.pivot_table(columns = 'hire_year')
'Study > class note' 카테고리의 다른 글
R / 조인 (0) | 2022.01.19 |
---|---|
R / 막대그래프, 원형그래프 (0) | 2022.01.19 |
R / 문자함수(gsub), 날짜함수, 변환함수, 일반함수, 그룹함수 (0) | 2022.01.18 |
R / R자료형, 연산자, 중복제거, 데이터 정렬, 문자함수(lower, substr) (0) | 2022.01.17 |
R / R설치 및 R이란 무엇인가 (0) | 2022.01.17 |