2016-02-25 14 views
6

Ich habe eine Abfrage wie dieseWie kann ich eine Aggregatfunktion für einen Ausdruck ausführen, der ein Aggregat oder eine Unterabfrage enthält?

SELECT Id 
    ,sum(CASE 
      WHEN ErrorId NOT IN (      
        ,10      
        ,11      
        ,12 
        ,13 
        ) 
       THEN 1 
      ELSE 0 
      END) errorCount 
FROM Table 
group by Id 

Ich mag die hartcodierte Liste der IDs nicht, und ich habe eine einfache Abfrage, die mir bekommen, was ich will

SELECT Id 
    ,sum(CASE 
      WHEN ErrorId NOT IN (
       select ErrorId from Errors where ErrorCategory = 'Ignore_Error' 
        ) 
       THEN 1 
      ELSE 0 
      END) errorCount 
FROM Table 
group by Id 

Allerdings, wenn ich versuchen, diese Ich bekomme

Kann eine Aggregatfunktion für einen Ausdruck, der ein Aggregat oder eine Unterabfrage enthält, nicht ausführen.

Was ist mein bester Weg?

Antwort

3

Wie in Fehlermeldung angegeben Sie können nicht Aggregate Funktion auf der Sub-Query

verwenden Hier ist der richtige Weg, es

SELECT t.Id, 
     Count(e.ErrorId) errorCount 
FROM Table t 
     LEFT JOIN Errors e 
       ON t.ErrorId = e.ErrorId 
       AND e.ErrorCategory = 'Ignore_Error' 
GROUP BY t.Id 

Ein anderer Weg Outer Apply

SELECT t.Id, 
     Count(ou.ErrorId) errorCount 
FROM Table t 
     OUTER apply (SELECT e.ErrorId 
        FROM Errors e 
        WHERE t.ErrorId = e.ErrorId 
          AND e.ErrorCategory = 'Ignore_Error') ou 
GROUP BY t.id 
verwenden werden zu tun
Verwandte Themen