| 단축키 | 기능 |
|---|---|
| CTRL + ENTER | 현재 쿼리 실행 |
| CTRL + \ | 새 탭에서 현재 쿼리 실행 |
| CTRL + / | 현재 단일 행 주석 전환 |
| CTRL + SHIFT + / | 여러 행 주석 전환 |
| CTRL + ] | 새 SQL 편집기 열기 |
| CTRL + SHIFT + ↑ / ↓ | 선택한 행을 위/아래로 이동 |
| ALT + ↑ / ↓ | 위/아래 쿼리문 블록 일괄 선택 |
| CTRL + SHIFT + F | 선택한 SQL문 자동 정리 |
-- Dataset 전체 읽기
SELECT *
FROM HR.HR_Employee_Attrition hea
;
-- 특정 Column만 읽기
SELECT EmployeeNumber , Attrition , Department , JobRole , JobLevel
FROM HR.HR_Employee_Attrition hea
;
Q) hr_employee_attrition 데이터에서 Python Pandas DataFrame으로 동일하게 Column을 추출하려면 ?
A) df[[‘EmployeeNumber’, ‘Attrition’, ‘Department’, ‘JobRole’, ‘JobLevel’]]
DISTINCT : 해당 컬럼의 중복 제거된 Unique 값
-- Row 수 확인 : 1470 row
SELECT COUNT(*) Headcount
FROM HR.HR_Employee_Attrition hea
;
-- 직원 수 확인 : 1470
SELECT COUNT(DISTINCT EmployeeNumber) Headcount
FROM HR.HR_Employee_Attrition hea
;
/*GROUP BY & ORDER BY*/
-- Department,JobRole,JobLevel 별 재직 인원수를 구해보자
SELECT Department , JobRole , JobLevel -- 2
, COUNT(*) HC -- 5
FROM HR.HR_Employee_Attrition hea -- 1
WHERE Attrition = 'No' -- 3
GROUP BY Department, JobRole, JobLevel -- 4
;
-- 다양한 집계함수
-- Department,JobRole,Gender 별로 재직인원수, Age의 최대/최소/평균값
SELECT Department , JobRole , Gender
, COUNT(*) hc
, MAX(age) max_age
, MIN(age) min_age
, AVG(age) avg_age
FROM HR.HR_Employee_Attrition hea
WHERE Attrition = 'No'
GROUP BY 1,2,3
;
-- Department,JobLevel별로 아래의 계산값을 산출해보자
-- 재직인원수, TotalWorkingYears 평균값, YearsAtCompany 평균값, MonthlyIncome 최대값, MonthlyIncome 최소값
SELECT Department , JobLevel
, COUNT(*) hc
, ROUND(AVG(TotalWorkingYears), 1) avg_total_years
, ROUND(AVG(YearsAtCompany),1) avg_years_at_company
, MAX(MonthlyIncome) max_income
, MIN(MonthlyIncome) min_income
FROM HR.HR_Employee_Attrition hea
WHERE Attrition = 'No'
GROUP BY 1,2
ORDER BY avg_years_at_company DESC
;
-- 데이터셋에 중복값이 없음을 확인
SELECT
(SELECT COUNT(*)
FROM HR.HR_Employee_Attrition hea)
=
(SELECT COUNT(DISTINCT EmployeeNumber) AS hc
FROM HR.HR_Employee_Attrition hea) check_duplicated
;
SELECT count(*)
FROM (
SELECT DISTINCT *
FROM hr.hr_employee_attrition hea
)hea2
;
-- 특정 팀의 인원수 파악
SELECT count(*)
FROM hr.hr_employee_attrition hea
WHERE Department = 'Sales'
AND Attrition = 'No'
;
-- Quiz
-- 최소 1년 이상 재직 / 나이 30살 이하 / level 2 이하 / HR팀 제외
SELECT COUNT(*)
FROM HR.HR_Employee_Attrition hea
WHERE 1 = 1
AND YearsAtCompany >= 1
AND Attrition = 'No'
AND Age <= 30
AND JobLevel <= 2
AND Department != 'Human Resources'
-- 최소 5년 이상 재직 / 나이 30~45 / level 3,4 / Sales 혹은 R&D 소속
SELECT COUNT(*)
FROM HR.HR_Employee_Attrition hea
WHERE 1 = 1
AND YearsAtCompany >= 5
AND Attrition = 'No'
AND AGE BETWEEN 30 AND 45 -- Age >= 30 AND age < =45
AND JobLevel IN(3, 4) -- AND JobLevel BETWEEN 3 AND 4
AND Department IN('Sales', 'Research & Development')
;
-- Department, joblevel, gender별 인원수, 평균 연령 표기
-- 평균 연령으로 내림차순 (Round 0)
-- HC, avg_age 컬럼명 명명
SELECT Department, JobLevel, Gender
, COUNT(*) HC
, ROUND(AVG(Age), 0) Avg_age
FROM HR.HR_Employee_Attrition hea
WHERE 1 = 1
AND YearsAtCompany >= 5
AND Attrition = 'No'
AND AGE BETWEEN 30 AND 45
AND JobLevel IN(3, 4)
AND Department IN('Sales', 'Research & Development')
GROUP BY 1,2,3
ORDER BY Avg_age DESC
;
Q1) 사내 공로상 대상자 후보를 선정하고 있습니다.
정성적인 평가에서 앞서 정량적인 기준으로 대상자를 추려보려 합니다.
대상 인원의 EmployeeNumber 리스트를 구하기 위한 쿼리를 작성해주세요.
⠀1. 재직연수 5년 이상
⠀2. 입사 이후 동일 Role 에서 지속 근무
⠀3. 최근 1년 이내 승진 이력이 없음 (동일 Level에서 1년 이상 근무 중)
Q2) Q1에서 구한 결과값에 대하여, Department, JobRole, JobLevel 별로 대상 인원수를
구하기 위한 쿼리를 작성해주세요. (JobLevel을 기준으로 내림차순)
-- Q1) EmployeeNumber 리스트
-- 재직연수 5년이상, 입사 이후 동일 Role에서 지속근무
-- , 최근 1년 이내 승진 이력 없음(동일 level에서 1년이상 근무)
SELECT EmployeeNumber
FROM HR.HR_Employee_Attrition hea
WHERE 1=1
AND Attrition = 'No'
AND YearsAtCompany >=5
AND YearsInCurrentRole = YearsAtCompany
AND YearsSinceLastPromotion > 1
;
-- Q2) Department, JobRole, JobLevel 별로 대상 인원수를 구하기 위한 쿼리 작
-- (JobLevel을 기준으로 내림차순)
SELECT Department, JobRole, JobLevel
, COUNT(*) HC
FROM HR.HR_Employee_Attrition hea
WHERE 1=1
AND Attrition = 'No'
AND YearsAtCompany >=5
AND YearsInCurrentRole = YearsAtCompany
AND YearsSinceLastPromotion > 1
GROUP BY 1,2,3
ORDER BY JobLevel DESC
;