database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
Oracle
Informix
Sybase
ㆍMS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
MS-SQL Q&A 5733 게시물 읽기
No. 5733
급여총액구하는 프로시져[급합니다.]
작성자
dprtlzhs
작성일
2010-08-18 19:37
조회수
7,261

고수님들.. 한테 부탁 있어 이렇게 글을 남깁니다.

아래와 같이 3개의 테이블을 이용하여 프로시져를 짜는 건데여..

급여총액을 구하는 내용 입니다.

선언은 아무것도 조건을 주지않으면 모든사원이 조회되는것과 

특정 사원이나 이름을 조건 주면 그 해당 사원만 조회 되도록 하는 겁니다.

프로시져는 한번도 해본적이 없어서.. 막막 합니다.

고수님들 보시고 어떻게 해야 하는지. 문장좀. 달아 주십시요. 부탁드립니다.

테이블 명 : tbl_Employee

EmpNo KoreanName EngName BussUnit  BelongDeptCode  WorkDeptCode PayGrade
20011101 장민석   JANG MIN SEOK        1           500 500 3015
20020401 김상민   Kim Sang Min         1           410 410 3007

테이블명 :   tbl_PayTable

 

BussUnit BasisDate ItemCode PayGrade PayStep  Amt 
1 20090301 10001 3015 1   2,279,950
1 20090301 10001 3015 2   2,359,770
1 20090301 10001 3015 3   2,666,890
1 20090301 10001 3016 1   1,960,650
1 20090301 10001 3016 2   2,170,190
1 20090301 10001 3016 3   2,279,950
1 20090301 10001 3016 4   2,359,770
1 20090301 10001 3016 5   2,666,890
1 20090301 10001 3007 1   1,646,350
1 20090301 10001 3007 2   1,850,900
1 20090301 10001 3007 3   1,850,900
1 20090301 10001 3007 4   1,905,770
1 20090301 10001 3007 5   1,960,650

테이블명 : tbl_PayMaster

BussUnit EmpNo PayDate PayBonusKind BelongDeptCode  PayGrade  PayStep Qualification  TotalPayAmt 
1 20011101 20090930 5001 500 03015 01 1020      1,428,130
1 20011101 20091023 5000 500 03015 01 1020      4,341,670
1 20011101 20091125 5000 500 03015 01 1020      4,341,670
1 20011101 20091224 5000 500 03015 01 1020      4,341,670
1 20011101 20100125 5000 500 03015 01 1020      4,341,670
1 20011101 20100128 5001 500 03015 01 1020      5,000,000
1 20011101 20100210 5001 500 03015 01 1020      1,428,130
1 20011101 20100225 5000 500 03015 01 1020      4,341,670
1 20011101 20100325 5000 500 03015 01 1020      4,509,380
1 20011101 20100423 5000 500 03015 01 1020      4,509,380
1 20011101 20100525 5000 500 03015 01 1020      1,600,100
1 20020401 20070425 5000 410 03007 01 1020      4,002,080
1 20020401 20070525 5000 410 03007 01 1020      3,750,000
1 20020401 20070625 5000 410 03007 01 1020      3,750,000
1 20020401 20070630 5001 410 03007 01 1020      2,718,750
1 20020401 20070725 5000 410 03007 01 1020      3,750,000
1 20020401 20070824 5000 410 03007 01 1020      3,750,000
1 20020401 20070920 5001 410 03007 01 1020        500,000
1 20020401 20070921 5000 410 03007 01 1020      3,750,000
1 20020401 20071025 5000 410 03007 01 1020      3,750,000
1 20020401 20071123 5000 410 03007 01 1020      3,750,000
1 20020401 20071224 5000 410 03007 01 1020      3,750,000
1 20020401 20071227 5001 410 03007 01 1020      2,718,750
1 20020401 20080125 5000 410 03007 01 1020      3,750,000
1 20020401 20080225 5000 410 03007 01 1020      3,750,000
1 20040801 20100325 5000 100 03007 01 1014      3,567,700
1 20040801 20100423 5000 100 03007 01 1014      3,567,700
1 20040801 20100525 5000 100 03007 01 1014      3,567,700
1 20040801 20100625 5000 100 03007 01 1014      3,567,700
1 20040801 20100723 5000 100 03007 01 1014      3,567,700
1 20040801 20100917 5001 100 03007 01 1014      1,413,800

이 글에 대한 댓글이 총 10건 있습니다.

/*

exec proc_GetTotalPayAmt '20011101', '장민석'

*/

CREATE PROCEDURE [dbo].[proc_GetTotalPayAmt]
   @iEmpno    VARCHAR(8) = ''  --사원번호
  ,@iKoreanName   VARCHAR(20) = ''  --성명
AS

BEGIN

 SELECT a.empno, a.KoreanName, isnull(sum(b.TotalPayAmt),0) as TotalPayAmt
   FROM tbl_Employee a
    LEFT JOIN tbl_PayMaster b
        ON a.Empno = b.Empno
       AND a.BussUnit = b.BussUnit
     WHERE a.empno like @iEmpno + '%'
       AND a.KoreanName like @iKoreanNAme + '%'
     GROUP BY a.empno, a.KoreanName

END

착한넘(agoodman99)님이 2010-08-19 09:26에 작성한 댓글입니다.
이 댓글은 2010-08-19 09:27에 마지막으로 수정되었습니다.

 

죄송합니다. 어렵게 작성해 주셨는데.. 내용 전달이 잘못된것 같습니다.

다시 설명하자면여...  tbl_Employee과 tbl_PayTable테이블을에서 PayGrade와 PayStep가 일치하면

tbl_PayTable테이블의 가장 최근 날짜인 BasisDate의 Amt필드의 값을 가져오게 되는 겁니다.

그리고, tbl_PayMaster테이블의 값도 가장 최근의 날짜인 PayDate필드의 TotalPayAmt값을 가져오는거죠..  그런다음 일치하지 않으면. Insert를 하고 잘못됬다면. Update를 하게 되는거죠.

이렇게 프로시져를 구현하고 싶다는 말이였습니다.

죄송합니다 .힘들게 짜주셨는데. 또다시 요구를 드리게 되는군여.. 다시 한번 부탁드립니다.

테이블명 : tbl_Employee          
EmpNo KoreanName EngName BussUnit  BelongDeptCode  WorkDeptCode PayGrade PayStep
20011101 장민석   JANG MIN SEOK        1                  500 500 3015 1

테이블명 : tbl_PayTable            
BussUnit BasisDate ItemCode PayGrade PayStep  Amt       
1 20090301 10001 3015 1              2,279,950      
1 20090301 10001 3015 2              2,359,770      
                 
테이블명 : tbl_PayMaster            
BussUnit EmpNo PayDate PayBonusKind BelongDeptCode  PayGrade  PayStep Qualification  TotalPayAmt 
1 20011101 20090930 5001 500 03015 01 1020      1,428,130
1 20011101 20091023 5000 500 03015 01 1020      4,341,670
1 20011101 20091125 5000 500 03015 01 1020      4,341,670
1 20011101 20091224 5000 500 03015 01 1020      4,341,670
1 20011101 20100125 5000 500 03015 01 1020      4,341,670
1 20011101 20100128 5001 500 03015 01 1020      5,000,000
1 20011101 20100210 5001 500 03015 01 1020      1,428,130
1 20011101 20100225 5000 500 03015 01 1020      4,341,670
1 20011101 20100325 5000 500 03015 01 1020      4,509,380
1 20011101 20100423 5000 500 03015 01 1020      4,509,380
1 20040801 20100917 5001 100 03007 01 1014      1,413,800

결과값은 이렇게 나오길 바라는겁니다.

사번 이름 가장최근 Amt 가장최근 TotalPayAmt
Basisdate PayDate
20011101 장민석   20090301   2,279,950 20100423        4,509,380

dprtlzhs님이 2010-08-19 11:30에 작성한 댓글입니다. Edit

마지막의 결과값을 제 4의 테이블에 저장 또는 수정을 하는건가요??

아님 저 결과값을 조회만 하면 되는건가요?

저장은 어디에??

 

 

착한넘(agoodman99)님이 2010-08-19 12:20에 작성한 댓글입니다.

네.. 맞습니다.

마지막의 결과값을 제 4의 테이블에 저장 또는 수정을 하는 겁니다.

저장 또는 수정 테이블은 tbl_PayMaster 되는 겁니다.

 

dprtlzhs님이 2010-08-19 12:37에 작성한 댓글입니다. Edit

제가 말한 제4의테이블은 위에 3개 말고 다른 테이블을 의미한건데 ㅠㅠ

첫번째 구한 값이 empno, basisDate, Amt

두번째 구한 값이 empno, PayDate, TotalPayAmt

가 나오겠죠 그런데 이걸 어떻게 비교 해서  tbl_PayMaster에 추가 또는 수정을 한다는 건가요?

tbl_PayMaster에 없으면 PayDate를 BasisDate로 넣은다는 건가요??

.......

tbl_PayTable는 직원 급여 마스터 테이블 같고

tbl_PayMaster는 급여 지급 테이블 같은데 맞나요?

그럼 급여를 지급할때 타는 프로시져를 만든다는건가요??

예를 들어 이번달에 급여를 지급하는데 지급내역이 없으면 등록하고 지급내역이 있으면

TotalPayAmt값을 Amt와 더한다던지 아니면 바꾼다던지..??

 

 

착한넘(agoodman99)님이 2010-08-19 14:24에 작성한 댓글입니다.

agoodman99님의 말이 맞네여..

제가 또 잘못 설명하듯 싶습니다. 여기 온지 얼마 되지 않아. 아직 테이블 구조를 파악 못하서

자꾸 헷갈리게 설명한것 같습니다.

tbl_PayMaster테이블은 급여 지급이기 때문에 필요하지 않은것 같구여..

위의 tbl_Employee 와  tbl_PayTable 테이블중에서 가장 최근의 날짜(Basisdate)값의 itemcode코드

해당되는 Amt 값을 가져오는 겁니다. (참고로 itemcode는 급여항목 코드 입니다)

dprtlzhs님이 2010-08-19 14:45에 작성한 댓글입니다. Edit

SELECT a.Empno, b.BasisDate, b.Amt
   FROM tbl_Employee a
    JOIN tbl_PayTable b ON a.PayGrade = b.PayGrade AND a.Paystep = b.PayStep
  WHERE a.Empno like  @iEmPno + '%'
       AND a.KoreanName like @iKoreanName + '%'
       AND b.BasisDate = (SELECT MAX(c.BasisDate)
          FROM tbl_PayTable c          
         WHERE c.Paygrade = a.PayGrade
        AND c.PayStep = a.PayStep)

 

착한넘(agoodman99)님이 2010-08-19 15:54에 작성한 댓글입니다.

정말 대단 하십니다. 진짜루 감사합니다.

근데 하나 더 궁금한 점이 있는데여..

exec pro_paysum '%','%'     했을때.. 값이 전 직원 다 나오게 할려면 어떻게

해야 되나여..?  

dprtlzhs님이 2010-08-19 17:04에 작성한 댓글입니다. Edit

WHERE a.Empno like  @iEmPno + '%'
       AND a.KoreanName like @iKoreanName + '%'
보시면 like  @iEmPno + '%' <-- 이부분에  '%'를 미리 넣어놨습니다.

exec pro_paysum '',''    이렇게 하시면 전부다 조회 됩니다.

아니면..

WHERE a.Empno like  @iEmPno 
       AND a.KoreanName like @iKoreanName

이렇게 하시고

 exec pro_paysum '%','%'    이렇게 하시면 전부다 조회 됩니다.

 

착한넘(agoodman99)님이 2010-08-19 19:34에 작성한 댓글입니다.

와우.. 진짜. 맞네여..

제가 조건을 줄때. @iBussUnit를 주니까. 안나온것 같습니다.

사번과 이름만 줬어야 하는데.. 그치여..?

덕분에.. 큰것 하나 배우고 갑니다. .감사합니다.

오늘 하루도 즐겁게 보내세요.

dprtlzhs님이 2010-08-20 09:17에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
5736셀렉트 해올때 IF문을 사용할수있나요? [1]
정재원
2010-08-24
7519
5735IMG 파일을 INSERT 시키는 쿼리
kimmd
2010-08-23
6358
5734SQL 2008 Std 메모리 Full 현상 입니다. [2]
강진수
2010-08-20
8773
5733급여총액구하는 프로시져[급합니다.] [10]
dprtlzhs
2010-08-18
7261
5732특정패턴 형태 조건만족 데이터 조회 관련 문의입니다.
임삼
2010-08-16
6134
5731테이블 상속에 대한 질문입니다.
이기자
2010-08-12
6438
5730sql에서 visual basic 연동관련 질문입니다... [1]
김윤회
2010-08-12
6746
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.022초, 이곳 서비스는
	PostgreSQL v16.4로 자료를 관리합니다