2014-08-28 4 views
4

저희 회사는 현재 전국적으로 150 개 이상의 부서를 운영하고 있습니다. 특정 직책의 경우, 우리는 직원들에게 각 지불 기간을 상환함으로써 유니폼을 지불합니다. 각 부서에는 자체 직원 및 급여 사무소가 있지만 모든 급여는 제 3자가 중앙에서 처리합니다. 회사 내에서의 이전으로 인해 직원이 각 지불 기간마다 중복 환급을받는 위험이 적습니다. 예를 들어, 직원 A는 새로운 부서로 이전하고 새로운 부서뿐만 아니라 구 부문에서도 지속적으로 상환됩니다. 우리 수표가 중앙 집중식으로 처리되었으므로 이런 일이 발생하지 않아야합니다.하지만 회사 데이터웨어 하우스에서 데이터를 가져 와서는 안된다는 것을 확인하고 싶습니다.SQL 쿼리 중복 데이터

이 테스트를 위해 작성한 쿼리는 직원이 근무한 여러 부서의 수를 기준으로 PAYDATE (PAYDATE) 및 Uniform Allowance (UACPPD)를 불필요하게 복제하는 것으로 보입니다.이 직원의 경우 5 개의 다른 부서에서 근무했으며 지역 HR 사무소에서 새 채용 날짜를 현지 시스템으로 이관 할 때마다 동일한 PAYDATE에 대해 5 개의 다른 행이 있습니다. 이것은 반복되는 값과 관련이 있다고 확신합니다.이를 방지하기 위해 쿼리를 구조화하는 방법을 모르겠습니다. 두 테이블 모두를 가져와야하므로 옵션이 아니며 사용하는 조인 유형에 관계없이 복제가 존재합니다. 모든 안내에 미리 감사드립니다!

SELECT 
P1.store_number as ST# 
,P1.store_transferred_from as XST# 
,P1.employee_name as NAME 
,P1.ssn as SSN 
,P2.pay_date as PAYDATE 
,P2.uniform_allowance_amt_cppd AS UACPPD 
,P1.job_series as JOBCODE 
,P1.hire_date as HIREDATE 


FROM PersonnelFile as P1 
LEFT JOIN PayrollFile as P2 
ON P1.SSN = p2.SSN 
WHERE P2.pay_date > '2010-05-14' 
and P2.uniform_allowance_amt_cppd in (8.25,8.50,300) 
and P1.jobs_series in ('2380','1458') 
and P1.ssn = '123456789' 

ORDER BY P1.ssn,P2.pay_date; 
+0

TOP()의 경우 SQL Server 2012 – Joseph

답변

2

가장 최근 기록을 원하는 것처럼 들립니다. PersonnelFileP1.SSN = P2.SSN를 통해 PayrollFile에 결합되어야한다는 방식으로 인해

SELECT P1.store_number as ST#, 
     P1.store_transferred_from as XST#, 
     P1.employee_name as NAME, 
     P1.ssn as SSN, 
     P2.pay_date as PAYDATE, 
     P2.uniform_allowance_amt_cppd AS UACPPD, 
     P1.job_series as JOBCODE, 
     P1.hire_date as HIREDATE 
FROM 
(
    SELECT TOP(1) * FROM PersonnelFile as PS1 
    WHERE PS1.jobs_series in ('2380','1458') 
    AND PS1.ssn = '123456789' 
    ORDER BY PS1.hire_date DESC 
) AS P1 
LEFT JOIN PayrollFile as P2 ON P1.SSN = p2.SSN 
WHERE P2.pay_date > '2010-05-14' 
    AND P2.uniform_allowance_amt_cppd in (8.25,8.50,300) 
ORDER BY P1.ssn, P2.pay_date 

당신은 점점 중복 :

SELECT TOP(1) P1.store_number as ST#, 
     P1.store_transferred_from as XST#, 
     P1.employee_name as NAME, 
     P1.ssn as SSN, 
     P2.pay_date as PAYDATE, 
     P2.uniform_allowance_amt_cppd AS UACPPD, 
     P1.job_series as JOBCODE, 
     P1.hire_date as HIREDATE 
FROM PersonnelFile as P1 
LEFT JOIN PayrollFile as P2 ON P1.SSN = p2.SSN 
WHERE P2.pay_date > '2010-05-14' 
    AND P2.uniform_allowance_amt_cppd in (8.25,8.50,300) 
    AND P1.jobs_series in ('2380','1458') 
    AND P1.ssn = '123456789' 
ORDER BY P1.hire_date DESC, P1.ssn, P2.pay_date 

편집 : 왜 1로 결과를 제한 한 후 P1.hire_date DESC으로 주문하지 . 직원이 SSN과 함께 이전 할 때마다 새 레코드를 추가합니다. 따라서 PersonnelFile의 각 레코드는 PayrollFile의 모든 레코드에 동일하게 SSN이 연결됩니다.

+1

+1입니다. OP가 SQL을 조작하면 좋을 것입니다. –

+0

@linger 작동하지 않는 것 같습니다. DISTINCT 문을 시도한 그들은 모두 동일한 중복 된 행을 반환합니다. SELECT TOP (1) 문을 사용하면 112 행의 과거 지불 기간을 볼 필요가있는 단일 행만 반환하므로이를 조정했습니다. 나는 왜 데이터가 중복되는지 왜 의아해하고있다. – Joseph

+1

@ lovetofly38, 내 편집을 확인하십시오, 더 나은 당신을 위해 일하니? – Linger