본문 바로가기

DB/MS-SQL

[MS-SQL] 쿼리문 작성 순서

어떤것을 쿼리문을 만들 때

 

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