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