2017-04-27 2 views
0

Wie kann ich eine Bedingung innerhalb der WHERE CLAUSE basierend auf einem Fall oder wenn Bedingung hinzufügen?SQL hinzufügen zu WHERE-Klausel basierend auf Bedingung

SELECT C.CallID, A.GroupName,A.Assignee, C.CallStatus, C.RecvdDate, C.Urgency, C.Category, C.CallType, C.KPIreport, C.CallDesc, 
DATEDIFF(DAY, C.RecvdDate,GETDATE()) [DurationInDays], 
CASE 
    WHEN DATEDIFF(DAY, C.RecvdDate,GETDATE()) < 30 
     THEN 'Less than 30' 
    WHEN DATEDIFF(DAY, C.RecvdDate,GETDATE()) >= 30 AND DATEDIFF(DAY, C.RecvdDate,GETDATE()) < 60 
     THEN '30-59' 
    WHEN DATEDIFF(DAY, C.RecvdDate,GETDATE()) >= 60 AND DATEDIFF(DAY, C.RecvdDate,GETDATE()) < 90 
     THEN '60-89' 
    WHEN DATEDIFF(DAY, C.RecvdDate,GETDATE()) >= 90 AND DATEDIFF(DAY, C.RecvdDate,GETDATE()) < 120 
     THEN '90-119' 
    WHEN DATEDIFF(DAY, C.RecvdDate,GETDATE()) >= 120 
     THEN 'Over 120' 
END 

AS 'AgeClassification' 

FROM 
    CallLog C 
    INNER JOIN Asgnmnt A ON C.CallID = A.CallID 
WHERE 
    A.HEATSeq =(SELECT MAX(HEATSeq)FROM Asgnmnt WHERE (CallID = C.CallID)) 
    AND UPPER(A.GroupName) = @GroupName 
    AND LOWER(A.EMail) IN (@Assignee) 
    AND UPPER(C.CallStatus) = @RecordType 

    AND 
    CASE WHEN UPPER(C.CallStatus) = 'CLOSED' THEN 
      C.ClosedDate >= @StartDate AND C.ClosedDate <= @EndDate 
     WHEN UPPER(C.CallStatus) = 'REQUEST TO CLOSE' THEN 
      A.DateResolv >= @StartDate AND A.DateResolv <[email protected] 
    END 




ORDER BY A.GroupName, A.Assignee, C.RecvdDate, C.CallID 

Meine Logik ist hier, dass, wenn die @RecordType ‚ZU‘ ist, wird die WHERE Klausel muss das geschlossene Datum bestätigen und wenn die @RecordType ist ‚REQUEST TO CLOSE‘ dann muss es das aufgelöste Datum bestätigen.

Ich habe auch versucht, dies mit IF-Anweisung, aber ich bekomme den gleichen Fehler.

+0

Wo column1 = Fall lesen, wenn die Bedingung dann column1 Ende schätzen anderes. Tun Sie dies für beide Fälle. – scsimon

+1

Was ist also Ihr Problem bei dieser Abfrage? –

+0

können Sie hier einige Beispieldaten und die gewünschte Ausgabe anzeigen? –

Antwort

2

Bitte versuchen Sie folgendes versuchen ...

SELECT C.CallID, 
     A.GroupName, 
     A.Assignee, 
     C.CallStatus, 
     C.RecvdDate, 
     C.Urgency, 
     C.Category, 
     C.CallType, 
     C.KPIreport, 
     C.CallDesc, 
     DATEDIFF(DAY, 
       C.RecvdDate, 
       GETDATE()) AS DurationInDays, 
     CASE 
      WHEN DATEDIFF(DAY, 
          C.RecvdDate, 
          GETDATE()) < 30 THEN 
       'Less than 30' 
      WHEN DATEDIFF(DAY, 
          C.RecvdDate, 
          GETDATE()) BETWEEN 30 AND 59 
       '30-59' 
      WHEN DATEDIFF(DAY, 
          C.RecvdDate, 
          GETDATE()) BETWEEN 60 AND 89 
       '60-89' 
      WHEN DATEDIFF(DAY, 
          C.RecvdDate, 
          GETDATE()) BETWEEN 90 AND 119 
       '90-119' 
      WHEN DATEDIFF(DAY, 
          C.RecvdDate, 
          GETDATE()) >= 120 THEN 
       '120 or over' 
     END AS 'AgeClassification' 
FROM 
    CallLog C 
    INNER JOIN Asgnmnt A ON C.CallID = A.CallID 
WHERE 
    A.HEATSeq =(SELECT MAX(HEATSeq) 
       FROM Asgnmnt 
       WHERE (CallID = C.CallID)) 
    AND UPPER(A.GroupName) = @GroupName 
    AND LOWER(A.EMail) IN (@Assignee) 
    AND UPPER(C.CallStatus) = @RecordType 
    AND ((@RecordType = 'CLOSED' AND 
      C.ClosedDate BETWEEN @StartDate AND @EndDate) OR 
      (@RecordType = 'REQUEST TO CLOSE' AND 
      A.DateResolv BETWEEN @StartDate AND @EndDate) OR 
      (@RecordType <> 'CLOSED' AND 
      @RecordType <> 'REQUEST TO CLOSE') 
     ); 

ich die ersten vier Bedingungen von Ihrem WHERE Klausel akzeptiert haben. Anstatt eine CASE für die fünfte Bedingung zu verwenden, habe ich stattdessen die entsprechende Form mit AND, OR und runden Klammern gewählt. Die erste Unterbedingung @RecordType = 'CLOSED' AND C.ClosedDate BETWEEN @StartDate AND @EndDate entspricht Ihrer ersten WHEN. Die zweite Unterbedingung @RecordType = 'REQUEST TO CLOSE' AND A.DateResolv BETWEEN @StartDate AND @EndDate) ist das Äquivalent zu Ihrer zweiten WHEN. Die dritte Teilbedingung erlaubt alle Datensätze, die die anderen Kriterien erfüllen, wobei @RecordType weder CLOSED noch REQUEST TO CLOSE ist. Sie sollten die dritte Unterbedingung entfernen, wenn Sie unter diesen Umständen lieber eine leere Menge zurückgeben möchten.

Von Ihrem vierten WHERE Zustand, wo UPPER(C.CallStatus) entweder CLOSED oder REQUEST TO CLOSE entspricht dann wird so @RecordType. So habe ich in Ihrem fünften Zustand UPPER(C.CallStatus) durch @RecordType ersetzt. Zusätzlich dazu, dass es etwas lesbarer ist, werden dadurch auch vier Funktionsaufrufe aus der Anweisung entfernt, wodurch es effizienter wird.

Ich habe auch Ihre CASE von früh in der Anweisung zu äquivalenten Bedingungen, die weniger Funktionsaufrufe verwenden, sind (wohl) einfacher zu lesen, und das parallel Ihre Feld Aliase parallel.

Wenn Sie irgendwelche Fragen oder Kommentare haben, dann zögern Sie nicht, einen Kommentar entsprechend zu posten.

Weitere

"CASE" statement within "WHERE" clause in SQL Server 2008

+0

Vielen Dank !!! – aronccs

+0

Gern geschehen. Freut mich, Ihnen behilflich zu sein. – toonice

0

Sie könnten der folgenden

SELECT C.CallID, 
     A.GroupName, 
     A.Assignee, 
     C.CallStatus, 
     C.RecvdDate, 
     C.Urgency, 
     C.Category, 
     C.CallType, 
     C.KPIreport, 
     C.CallDesc, 
     Datediff(DAY, C.RecvdDate, Getdate()) [DurationInDays], 
     CASE 
     WHEN Datediff(DAY, C.RecvdDate, Getdate()) < 30 THEN 'Less than 30' 
     WHEN Datediff(DAY, C.RecvdDate, Getdate()) >= 30 
       AND Datediff(DAY, C.RecvdDate, Getdate()) < 60 THEN '30-59' 
     WHEN Datediff(DAY, C.RecvdDate, Getdate()) >= 60 
       AND Datediff(DAY, C.RecvdDate, Getdate()) < 90 THEN '60-89' 
     WHEN Datediff(DAY, C.RecvdDate, Getdate()) >= 90 
       AND Datediff(DAY, C.RecvdDate, Getdate()) < 120 THEN '90-119' 
     WHEN Datediff(DAY, C.RecvdDate, Getdate()) >= 120 THEN 'Over 120' 
     END         AS 'AgeClassification' 
FROM CallLog C 
     INNER JOIN Asgnmnt A 
       ON C.CallID = A.CallID 
WHERE A.HEATSeq = (SELECT Max(HEATSeq) 
        FROM Asgnmnt 
        WHERE (CallID = C.CallID)) 
     AND Upper(A.GroupName) = @GroupName 
     AND Lower(A.EMail) IN (@Assignee) 
     AND Upper(C.CallStatus) = @RecordType 
     AND C.ClosedDate BETWEEN IIF(Upper(C.CallStatus) = 'CLOSED', @StartDate, C.ClosedDate) 
         AND IIF(Upper(C.CallStatus) = 'CLOSED', @EndDate, C.ClosedDate) 
     AND C.DateResolv BETWEEN IIF(Upper(C.CallStatus) = 'REQUEST TO CLOSE', @StartDate, C.DateResolv) 
         AND IIF(Upper(C.CallStatus) = 'REQUEST TO CLOSE',@EndDate, C.DateResolv) 
ORDER BY A.GroupName, 
      A.Assignee, 
      C.RecvdDate, 
      C.CallID 
1
SELECT C.CallID, A.GroupName,A.Assignee, C.CallStatus, C.RecvdDate, 
     C.Urgency, C.Category, C.CallType, C.KPIreport, C.CallDesc, 
     DATEDIFF(DAY, C.RecvdDate,GETDATE()) [DurationInDays], 
     CASE 
      WHEN (DATEDIFF(DAY, C.RecvdDate,GETDATE()) < 30) THEN 'Less than 30' 
      WHEN (DATEDIFF(DAY, C.RecvdDate,GETDATE()) >= 30 AND DATEDIFF(DAY, C.RecvdDate,GETDATE()) < 60) THEN '30-59' 
      WHEN (DATEDIFF(DAY, C.RecvdDate,GETDATE()) >= 60 AND DATEDIFF(DAY, C.RecvdDate,GETDATE()) < 90) THEN '60-89' 
      WHEN (DATEDIFF(DAY, C.RecvdDate,GETDATE()) >= 90 AND DATEDIFF(DAY, C.RecvdDate,GETDATE()) < 120) THEN '90-119' 
      WHEN (DATEDIFF(DAY, C.RecvdDate,GETDATE()) >= 120) THEN 'Over 120' 
     END AS 'AgeClassification' 
FROM CallLog C 
INNER JOIN Asgnmnt A ON C.CallID = A.CallID 
WHERE A.HEATSeq =(SELECT MAX(HEATSeq)FROM Asgnmnt WHERE (CallID = C.CallID)) 
AND UPPER(A.GroupName) = @GroupName 
AND LOWER(A.EMail) IN (@Assignee) 
AND UPPER(C.CallStatus) = @RecordType 
AND (CASE 
    WHEN UPPER(C.CallStatus) = 'CLOSED' THEN C.ClosedDate 
    WHEN UPPER(C.CallStatus) = 'REQUEST TO CLOSE' THEN A.DateResolv 
END) BETWEEN @StartDate AND @EndDate 
ORDER BY A.GroupName, A.Assignee, C.RecvdDate, C.CallID 
Verwandte Themen