2017-12-27 6 views
1

Ich habe zwei Tabellen. Ich nehme an, das Ergebnis in eine Zeile zu bringen, aber wenn ich mit der unten stehenden Abfrage versuche, ergibt sich eine Duplizierung.Beitreten Ergebnisse in Duplizierung

Abfrage:

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 

Für Referenz:

Tabelle 1: (LeaveCategory) enter image description here

Tabelle 2: (LeaveEntitledEntry)

enter image description here

Ergebnis:

enter image description here

So wie kann ich meine ändern verbindet erwartetes Ergebnis zu erzielen. Jede Hilfe wird geschätzt. Vielen Dank im Voraus

Antwort

1

Sie können versuchen, bedingte Aggregation zu verwenden, um auf die beiden Arten von Leave-Daten zuzugreifen, indem Sie eine Verknüpfung zu einer einzelnen Unterabfrage verwenden. Der Grund, warum dieser Trick funktioniert, ist, dass wir einen einzelnen Datensatz für jeden LeaveCategoryID zusammen mit seinen NoofDays Werten für die beiden Typen AL und MDL generieren können. Dies bedeutet, dass wir mit nur einem einzigen Join arbeiten können, was das Duplikationsproblem, das Sie hatten, vermeiden sollte.

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

Vielen Dank @Tim – Muzz

Verwandte Themen