급여를 계산하는 프로그램을 짜고 있습니다.
While을 이용해서 사원전체의 급여를 돌리기 싫어서 insert Select 를 이용해서
한꺼번에 넣으려고 합니다.
근데 한달에 사원의 데이터가 한번들어가야하는데...자꾸 같은데이터가 여러번 들어가요...
그래서 사원번호의 데이터를 중복제거했습니다.---> distinct 사원.S_No
P_ilsu에 (주월차.J_ilsu-(일수.Ji_Min + 일수.Ji_yeh))를 insert 하려하니까.. 또 여러번 들어가지더라구요.. 딱 2번씩 더 들어가있습니다. 총 3개의 중복데이터가 들어가져요...
고수님들... 이거 대체 어케된걸까요?
With Paysql do begin
Close;
Sql.Clear;
Sql.Add('Insert into 급여');
Sql.Add('(P_No,P_Ilsu,P_Month,P_Jucha,P_Moncha,P_Tday,');
Sql.Add('P_TPay,P_pay,P_Wi,P_Sub,P_Che)');
Sql.Add('Select distinct 사원.S_No,(주월차.J_ilsu-(일수.Ji_Min + 일수.Ji_yeh)),주월차.J_Month,');
Sql.Add('주월차.J_Jucha,주월차.J_Moncha,');
Sql.Add('((주월차.J_Ilsu+주월차.J_Jucha+주월차.J_Moncha)-');
Sql.Add('(Round((일수.Ji_jiil+일수.Ji_joil)/3))),');
Sql.Add('((((주월차.J_Ilsu+주월차.J_Jucha+주월차.J_Moncha)-(Round((일
수.Ji_jiil+일수.Ji_joil)/3)))*직급.F_Pay)+(5000*주월차.J_Ilsu)),');
Sql.Add('(((주월차.J_Ilsu+주월차.J_Jucha+주월차.J_Moncha)');
Sql.Add('*직급.F_Pay)');
Sql.Add('+(5000*주월차.J_Ilsu)-(국민연금.N_Pay+건강보험.H_Pay)),');
Sql.Add('(((주월차.J_Ilsu+주월차.J_Jucha+주월차.J_Moncha)');
Sql.Add('*직급.F_Pay)+(5000*주월차.J_Ilsu))*0.005,');
Sql.Add('(국민연금.N_Pay+건강보험.H_Pay),');
Sql.Add('"재직"');
Sql.Add('from 사원,주월차,직급,국민연금,건강보험,일수');
Sql.Add('Where 주월차.J_Month like'+#39+str+#39);
Sql.Add('and 사원.S_No = 주월차.J_No');
Sql.Add('and 직급.F_code = 사원.S_Tcheck');
Sql.Add('and 사원.S_Boss=True');
Sql.Add('and 국민연금.N_Code=사원.S_Np');
Sql.Add('and 건강보험.H_Code=사원.S_Nhi');
Sql.Add('and 일수.Ji_No=사원.S_No');
ExecSQL;
end;
테이블명이 한글로 되어있어서 소스를 보기 무척 난해하네요^^
전 필드명인줄 알았거든여..
insert select문장을 사용하실때 중복으로 데이타가 들어갈 경우에는
거의 select문이 만들어지는 과정의 잘못이라고 보시면 됩니다.
조인되는 과정에서 중복된 자료가 나올수 있는만큼
디버깅하실때 select부분만 독립적으로 테스트해보셨음 합니다.
글구..아래처럼 긴내용의 쿼리문같은 경우에는
프로시저로 작성을 하시거나, 아님 sql.add대신
sql.text기능을 사용하셔서 한번에 입력하시는방법도
나중에 유지보수에 편리하실거라 생각이 듭니다..
참고로 db쪽 에러가 날경우에는 어떤 RDB인지도 같이 말씀해주시면
답변을 하시는분들이 편하실거라 생각이 드네요^^
그럼 수고하세요..
info wrote:
> 급여를 계산하는 프로그램을 짜고 있습니다.
> While을 이용해서 사원전체의 급여를 돌리기 싫어서 insert Select 를 이용해서
> 한꺼번에 넣으려고 합니다.
> 근데 한달에 사원의 데이터가 한번들어가야하는데...자꾸 같은데이터가 여러번 들어가요...
> 그래서 사원번호의 데이터를 중복제거했습니다.---> distinct 사원.S_No
> P_ilsu에 (주월차.J_ilsu-(일수.Ji_Min + 일수.Ji_yeh))를 insert 하려하니까.. 또 여러번 들어가지더라구요.. 딱 2번씩 더 들어가있습니다. 총 3개의 중복데이터가 들어가져요...
> 고수님들... 이거 대체 어케된걸까요?
>
>
>
> With Paysql do begin
> Close;
> Sql.Clear;
> Sql.Add('Insert into 급여');
> Sql.Add('(P_No,P_Ilsu,P_Month,P_Jucha,P_Moncha,P_Tday,');
> Sql.Add('P_TPay,P_pay,P_Wi,P_Sub,P_Che)');
> Sql.Add('Select distinct 사원.S_No,(주월차.J_ilsu-(일수.Ji_Min + 일수.Ji_yeh)),주월차.J_Month,');
> Sql.Add('주월차.J_Jucha,주월차.J_Moncha,');
> Sql.Add('((주월차.J_Ilsu+주월차.J_Jucha+주월차.J_Moncha)-');
> Sql.Add('(Round((일수.Ji_jiil+일수.Ji_joil)/3))),');
> Sql.Add('((((주월차.J_Ilsu+주월차.J_Jucha+주월차.J_Moncha)-(Round((일
> 수.Ji_jiil+일수.Ji_joil)/3)))*직급.F_Pay)+(5000*주월차.J_Ilsu)),');
> Sql.Add('(((주월차.J_Ilsu+주월차.J_Jucha+주월차.J_Moncha)');
> Sql.Add('*직급.F_Pay)');
> Sql.Add('+(5000*주월차.J_Ilsu)-(국민연금.N_Pay+건강보험.H_Pay)),');
> Sql.Add('(((주월차.J_Ilsu+주월차.J_Jucha+주월차.J_Moncha)');
> Sql.Add('*직급.F_Pay)+(5000*주월차.J_Ilsu))*0.005,');
> Sql.Add('(국민연금.N_Pay+건강보험.H_Pay),');
> Sql.Add('"재직"');
> Sql.Add('from 사원,주월차,직급,국민연금,건강보험,일수');
> Sql.Add('Where 주월차.J_Month like'+#39+str+#39);
> Sql.Add('and 사원.S_No = 주월차.J_No');
> Sql.Add('and 직급.F_code = 사원.S_Tcheck');
> Sql.Add('and 사원.S_Boss=True');
> Sql.Add('and 국민연금.N_Code=사원.S_Np');
> Sql.Add('and 건강보험.H_Code=사원.S_Nhi');
> Sql.Add('and 일수.Ji_No=사원.S_No');
> ExecSQL;
> end;
>