어떤것을 쿼리문을 만들 때
1. 일단 문제를 보고나서 전체적인 뷰를 생각한다.
문제 : 2009년10월 부서별 직위별 인원수 및 급여를 나타내어라.
테이블 1
SELECT STAFF_NUM --사번 PK
,POST_CD --직위
,DEPT_CD --부서코드
,DEPT_NM --부서명
FROM HRM100MA
ORDER BY POST_CD
테이블 2
SELECT PAY_YYMM --급여월 PK
,PAY_TYPE --급상여구분 PK
,STAFF_NUM --사번 PK
,SUP_TOT_AMT --급여총액
FROM HRM410MA
부서명이 나오고 각 부서별 직위와 그 직위에 대한 인원 급여를 생각하며 어떤식으로 나와야 할지 생각해본다.
EX)
부서명 | 직위 | 급여 | 직위2 | 급여 | 직위3 | 급여 ... | 기타 | 기타급여 | 총 인원 | 총 급여
2. 나누어진 테이블을 join을 이용해서 연결해준다.
select *
from HRM100MA T1 INNER JOIN HRM410MA T2 ON T1.STAFF_NUM = T2.STAFF_NUM
3. 조건을 where에서 정하고
조건 : 2009년10월
select *
from HRM100MA T1 INNER JOIN HRM410MA T2 ON T1.STAFF_NUM = T2.STAFF_NUM
where T2.PAY_YYMM = '200910'
4. 그것에 어떤 별로 나눌 것인지 생각해서 group by를 한다.
~~별이 group by의 기준이 된다. 여기서는 부서별로 정리
select T1.DEPT_NM as '부서명'
from HRM100MA T1 INNER JOIN HRM410MA T2 ON T1.STAFF_NUM = T2.STAFF_NUM
where T2.PAY_YYMM = '200910'
group by T1.DEPT_NM
5.group by에서 조건이 있으면 having을 사용한다.
6. 보고 싶은 것을 select에서 설정한다.
select T1.DEPT_NM as '부서명',
sum(case when T1.POST_CD = '01' then 1 else 0 end) as 'C01',
floor(sum(case when T1.POST_CD = '01' then T2.SUP_TOT_AMT else 0 end)) as 'P01',
sum(case when T1.POST_CD = '02' then 1 else 0 end) as 'C02',
floor(sum(case when T1.POST_CD = '02' then T2.SUP_TOT_AMT else 0 end)) as 'P02',
sum(case when T1.POST_CD = '03' then 1 else 0 end) as 'C03',
floor(sum(case when T1.POST_CD = '03' then T2.SUP_TOT_AMT else 0 end)) as 'P03',
sum(case when T1.POST_CD = '04' then 1 else 0 end) as 'C04',
floor(sum(case when T1.POST_CD = '04' then T2.SUP_TOT_AMT else 0 end)) as 'P04',
sum(case when T1.POST_CD = '05' then 1 else 0 end) as 'C05',
floor(sum(case when T1.POST_CD = '05' then T2.SUP_TOT_AMT else 0 end)) as 'P05',
sum(case when T1.POST_CD = '06' then 1 else 0 end) as 'C06',
floor(sum(case when T1.POST_CD = '06' then T2.SUP_TOT_AMT else 0 end)) as 'P06',
sum(case when T1.POST_CD = '07' then 1 else 0 end) as 'C07',
floor(sum(case when T1.POST_CD = '07' then T2.SUP_TOT_AMT else 0 end)) as 'P07',
sum(case when T1.POST_CD = '08' then 1 else 0 end) as 'C08',
floor(sum(case when T1.POST_CD = '08' then T2.SUP_TOT_AMT else 0 end)) as 'P08',
sum(case when T1.POST_CD = '09' then 1 else 0 end) as 'C09',
floor(sum(case when T1.POST_CD = '09' then T2.SUP_TOT_AMT else 0 end)) as 'P09',
sum(case when T1.POST_CD = '10' then 1 else 0 end) as 'C10',
floor(sum(case when T1.POST_CD = '10' then T2.SUP_TOT_AMT else 0 end)) as 'P10',
SUM(case when T1.POST_CD > '10' then 1 else 0 end) as CEX,
floor(sum(case when T1.POST_CD > '10' then T2.SUP_TOT_AMT else 0 end)) as PEX,
SUM(case when ((T1.POST_CD > '0')and(T1.POST_CD < '10')) then 1 else 0 end) as CTOT,
floor(SUM(T2.SUP_TOT_AMT)) as PTOT
from HRM100MA T1 INNER JOIN HRM410MA T2 ON T1.STAFF_NUM = T2.STAFF_NUM
where T2.PAY_YYMM = '200910'
group by T1.DEPT_NM
'DB > MS-SQL' 카테고리의 다른 글
[MS-SQL]MS-SQL에서 go란? (0) | 2013.09.30 |
---|---|
[MS-SQL] SQL 실행 순서 (0) | 2013.09.30 |
[MS-SQL] ms-sql 단축키 (0) | 2011.12.01 |
[SQL]IDENT_CURRENT 와 SCOPE_IDEENTITY (0) | 2011.10.11 |
[T-SQL] while문 예 (0) | 2011.09.29 |