Redundante Zeilen aus Case Statement und Join SQL server

Ich bekomme einige Duplikate mit meiner Fallaussage.

So vermeiden Sie das ohne Unterabfragen?

SELECT [S].[TicketNbr] AS 'Ticket Nbr' , [S].[status_description] AS 'Status' , ( CASE WHEN [A].OldValue_Text = 'Service Desk' THEN 1 ELSE 0 END) AS 'Moved from Old Board?' END) AS 'Moved from Old Board?' FROM [Service] AS [S] LEFT OUTER JOIN [Audit] AS [A] ON [A].[TicketNbr]=[S].[TicketNbr] GROUP BY [S].[TicketNbr] , [S].[status_description] ,(CASE WHEN [A].OldValue_Text = 'Service Desk' THEN 1 ELSE 0 END) 

Beachten Sie, ich möchte nur die Zeile mit 1.

Bildbeschreibung hier eingeben

Das sind keine Duplikate, es handelt sich um separate datasätze, die sich aus mehreren Zeilen im Audit – in deinem Beispiel eins mit OldValue_Text von 'Service Desk' und einer, die nicht ist.

Nun, wenn du nur auf der search nach der 1 wenn vorhanden und 0 sonst, könnte man eines von drei Sachen machen:

  1. Halten Sie Ihre vorhandene Abfrage und nehmen Sie die maximale Ihrer dritten Spalte:

     SELECT [S].[TicketNbr] AS [Ticket Nbr], [S].[status_description] AS [Status], MAX((CASE WHEN [A].OldValue_Text = 'Service Desk' THEN 1 ELSE 0 END)) AS [Moved from Old Board?] FROM [Service] AS [S] LEFT OUTER JOIN [Audit] AS [A] ON [A].[TicketNbr]=[S].[TicketNbr] GROUP BY [S].[TicketNbr], [S].[status_description] 
  2. Verwenden Sie EXISTS mit einer korrelierten Unterabfrage (ich weiß, dass Sie sagen, dass Sie nicht eins verwenden möchten, aber das ist eine gültige Lösung):

     SELECT [S].[TicketNbr] AS [Ticket Nbr], [S].[status_description] AS [Status], CASE WHEN EXISTS (SELECT 1 FROM [Audit] AS [A] WHERE [A].[TicketNbr]=[S].[TicketNbr] AND [A].OldValue_Text = 'Service Desk') THEN 1 ELSE 0 END AS [Moved from Old Board?] FROM [Service] AS [S] 
  3. Fügen Sie OldValue_Text = 'Service Desk' die Kriterien OldValue_Text = 'Service Desk' der Join-Klausel hinzu. Dies wird die beigefügten Zeilen zu denen reduzieren, die du nachher hast. (Beachten Sie, dass es nur eine Zeile gibt, die übereinstimmt, wenn nicht, müssen Sie DISTINCT hinzufügen):

     SELECT [S].[TicketNbr] AS [Ticket Nbr], [S].[status_description] AS [Status], CASE WHEN [A].[TicketNbr] IS NOT NULL THEN 1 ELSE 0 END AS [Moved from Old Board?] FROM [Service] AS [S] LEFT OUTER JOIN [Audit] AS [A] ON [A].[TicketNbr]=[S].[TicketNbr] AND [A].OldValue_Text = 'Service Desk' 

Ihre Fall-statement ist in der select-Klausel, also ist es nicht geben Sie Duplikate. Auch das sind keine Duplikate, sie sind ganz andere Aufzeichnungen. Ich glaube alles, was Sie tun müssen, ist eine where-Klausel hinzuzufügen, die nur datasätze mit OldValue_Text von 'Service Desk'

 WHERE [A].OldValue_Text LIKE 'Service Desk' 

Du würdest dies nach deiner Klausel hinzufügen, aber vor deiner Klausel.

Dies verringert Ihr Ergebnis auf nur die Elemente, die einen Wert von 1 für Moved from old Board?

Wenn dies Ihnen Duplikate gibt, dann können Sie einfach eine distinct zu Ihrer select-Klausel hinzufügen

 SELECT DISTINCT [S].[TicketNbr] AS 'Ticket Nbr' , [S].[status_description] AS 'Status' , ( CASE WHEN [A].OldValue_Text = 'Service Desk' THEN 1 ELSE 0 END) AS 'Moved from Old Board?' END) AS 'Moved from Old Board?'