2017-12-27 17 views
1

두 개의 테이블이 있습니다. 한 행에 결과를 얻으려고하지만, 아래 쿼리를 시도하면 결과가 중복됩니다.합류 결과 중복

쿼리

참조 용
Select OrgaID, UnitID, LeaveTitle, NoOfFromService, NoOfToService, 
EmpType.EmployeeTypeName, IsExpatriate, 
(ALR.LeaveTypeShortName + '(' + convert(varchar,ALR.NoofDays) + ') | ' + 
MLR.LeaveTypeShortName + '(' + convert(varchar,MLR.NoofDays) + ') | ') 
Leaves 
From LeaveCategory LvCat  
Left Join (Select LeaveCategoryID, LeaveTypeShortName, NoofDays From 
LeaveEntitledEntry Where LeaveTypeShortName = 'AL') ALR On 
ALR.LeaveCategoryId = LvCat.Id 
Left Join (Select LeaveCategoryID, LeaveTypeShortName, NoofDays From 
LeaveEntitledEntry Where LeaveTypeShortName = 'MDL') MLR On 
ALR.LeaveCategoryId = LvCat.Id 
Where OrgaID = @OrgaID and LvCat.Status = 1 

:

표 1 : (LeaveCategory) enter image description here

표 2 : (LeaveEntitledEntry)

enter image description here

결과 :

enter image description here

그래서 내가 변경하는 방법을 내 예상 된 결과를 달성하기 위해 섭니다. 어떤 도움을 주셔서 감사합니다. 미리 감사드립니다.

답변

1

조건부 집계를 사용하면 하나의 하위 쿼리에 대한 조인을 사용하여 두 가지 유형의 탈퇴 데이터에 액세스 할 수 있습니다. 이 트릭이 작동하는 이유는 각 LeaveCategoryID에 대한 단일 레코드를 ALMDL 유형 모두에 대한 NoofDays 값과 함께 생성 할 수있게하기 위해서입니다. 즉, 우리는 하나의 조인만으로도 작업을 수행 할 수 있으므로 복제 문제를 피할 수 있습니다.

WITH cte AS (
    SELECT 
     LeaveCategoryID, 
     MAX(CASE WHEN LeaveTypeShortName = 'AL' THEN NoofDays END) AS NoofDaysAL, 
     MAX(CASE WHEN LeaveTypeShortName = 'MDL' THEN NoofDays END) AS NoofDaysMDL 
    FROM LeaveEntitledEntry 
    GROUP BY LeaveCategoryID 
) 

SELECT 
    OrgaID, 
    UnitID, 
    LeaveTitle, 
    NoOfFromService, 
    NoOfToService, 
    EmpType.EmployeeTypeName, 
    IsExpatriate, 
    'AL(' + CONVERT(varchar, t.NoofDaysAL) + ') | ' + 
    'MDL(' + CONVERT(varchar, t. NoofDaysMDL) + ') | ') AS Leaves 
FROM LeaveCategory LvCat  
LEFT JOIN cte t 
    ON LvCat.Id = t.LeaveCategoryID 
WHERE 
    OrgaID = @OrgaID AND 
    LvCat.Status = 1; 
+0

감사합니다. @Tim – Muzz