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

SQL无法对包含聚合或子查询的表达式执行聚合函数,sql,select,sql-server-2008-r2,case,Sql,Select,Sql Server 2008 R2,Case,我是SQL新手,我有以下SQL查询 select catalogid, numitems, allitems - numitems ignoreditems from ( select i.catalogid," sum(case when (ocardtype in ('PayPal','Sofort') OR ocardtype in ('mastercard','visa') and odate i

我是SQL新手,我有以下SQL查询

select catalogid, numitems, allitems - numitems ignoreditems
 from (
  select i.catalogid," 
    sum(case when (ocardtype in ('PayPal','Sofort') OR
                   ocardtype in ('mastercard','visa') and
                   odate is not null) AND NOT EXISTS (select CAST(booked AS INT) FROM bookedordersids b where b.booked = o.orderid)
                   then numitems
                   else 0 end) numitems,
    sum(numitems) allitems
  from orders o
  join oitems i on i.orderid=o.orderid
  group by i.catalogid
 ) X
它给了我以下的错误

Cannot perform an aggregate function on an expression containing an aggregat or a subquery
当我删除以下行时,它工作正常

AND NOT EXISTS (select CAST(booked AS INT) FROM bookedordersids b where b.booked = o.orderid)

但是做这个检查很重要;如何修复此问题?

您只需将聚合移出一级即可。
虽然查询可以在您的情况下重写,但我认为最好以这种方式表达,以便您可以轻松理解和重用该模式

select catalogid, sum(numitems) numitems, sum(allitems) - sum(numitems) ignoreditems
 from (
  select i.catalogid,
    case when (ocardtype in ('PayPal','Sofort') OR
                   ocardtype in ('mastercard','visa') and
                   odate is not null) AND NOT EXISTS (
      select *
      FROM bookedordersids b
      where b.booked = o.orderid)
                   then numitems
                   else 0 end
    numitems,
    numitems allitems
  from orders o
  join oitems i on i.orderid=o.orderid
 ) X
group by catalogid