2016-02-25 19 views
6

ho una query come questaCome posso eseguire una funzione di aggregazione su un'espressione contenente un aggregato o una sottoquery?

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

Non mi piace l'elenco hardcoded di ID e ho una semplice query che otterrà me quello che io voglio

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 

Tuttavia quando provo questo Ottengo

Impossibile eseguire una funzione di aggregazione su un'espressione contenente un aggregato o una sottoquery.

Qual è la mia migliore strada da percorrere?

risposta

3

Come indicato nel messaggio di errore non è possibile utilizzare la funzione Aggregate in cima Sub-Query

Qui è il modo corretto per farlo

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 

Un altro modo verrà utilizzato 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