SQL Server“无法对包含聚合或子查询的表达式执行聚合函数”,但Sybase可以

这个问题已经讨论了,但是没有一个答案解决我的具体问题,因为我正在处理内部和外部选择的不同的where子句.此查询在Sybase下执行得很好,但在sql Server下执行时,会发出此帖子的标题中的错误.查询很复杂,但查询的一般大纲是:
select sum ( t.graduates -
    ( select sum ( t1.graduates )
      from table as t1
      where t1.id = t.id and t1.group_code not in ('total','others' ) ) )
from table as t
where t.group_code = 'total'

以下描述我正在解决的情况:

>所有组代码代表比赛,除了“总”和“其他”
>组代码’total’代表所有种族的毕业生
>然而,多人种族缺失,所以毕业生的个人数量可能不高于总研究生人数
>这个丢失的数据是需要计算的

有没有使用派生表或联接来重写这个来获得相同的结果?

更新:我创建了sample data and 3 solutions to my specific problem(2受sgeddes影响).我添加包括将相关子查询移动到FROM子句中的派生表.谢谢你的帮助!

解决方法

一个选项是将子查询置于LEFT JOIN中:
select sum ( t.graduates ) - t1.summedGraduates 
from table as t
    left join 
     ( 
        select sum ( graduates ) summedGraduates,id
        from table  
        where group_code not in ('total','others' )
        group by id 
    ) t1 on t.id = t1.id
where t.group_code = 'total'
group by t1.summedGraduates

也许更好的选择是使用SUM与CASE:

select sum(case when group_code = 'total' then graduates end) -
    sum(case when group_code not in ('total','others') then graduates end)
from yourtable

SQL Fiddle Demo with both

相关文章

SELECT a.*,b.dp_name,c.pa_name,fm_name=(CASE WHEN a.fm_n...
if not exists(select name from syscolumns where name=&am...
select a.*,pano=a.pa_no,b.pa_name,f.dp_name,e.fw_state_n...
要在 SQL Server 2019 中设置定时自动重启,可以使用 Window...
您收到的错误消息表明数据库 'EastRiver' 的...
首先我需要查询出需要使用SQL Server Profiler跟踪的数据库标...