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

标签 sql select sql-server-2008-r2 case

我有以下 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

关于SQL 无法对包含聚合或子查询的表达式执行聚合函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12879041/

相关文章:

javascript - 动态创建一个选择,然后更改 ajax 调用以附加 html

sql-server - 在 Sql Azure 中收到错误 "Could not find stored procedure ' sp_OACreate'"

c# - 如何保持 sql 依赖性达到其目的

tsql - 遍历表行的最佳方法是什么?

mysql:在数据库中查找西里尔文或希腊文文本

java - 如何在集成测试中设置保存点(使用内存中的 hsqldb)?

sql - 如何找到列数相等的行?

mysql - 查找第一个表中与第二个表的行 id 与最大日期相匹配的行数

mysql - SQL 查询 - 按查询分组

mysql如何根据优先级使用ifnull?