如何对包含聚合或子查询的表达式执行聚合函数?

时间:2016-02-25 16:51:41

标签: sql sql-server subquery

我有这样的查询

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

我不喜欢硬编码的ID列表,我有一个简单的查询可以得到我想要的东西

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

然而,当我尝试这个时,我得到了

  

无法对包含的表达式执行聚合函数   聚合或子查询。

我最好的方法是什么?

1 个答案:

答案 0 :(得分:3)

如错误消息中所述,您无法在Aggregate

之上使用Sub-Query功能

这是正确的方法

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 

另一种方法是使用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