39

这个问题之前已经讨论过,但是没有一个答案能解决我的具体问题,因为我正在处理内部和外部选择中不同的 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”代表所有种族的毕业生总数
  • 但是,缺少多种族,因此种族毕业生人数可能不会与毕业生总数相加
  • 这个缺失的数据是需要计算的

无论如何使用派生表或连接重写它以获得相同的结果?

更新:我为我的具体问题创建了示例数据和 3 个解决方案(2 个受 sgeddes 影响)。我添加的一个涉及将相关子查询移动到 FROM 子句中的派生表。谢谢你们的帮助!

4

1 回答 1

55

一种选择是将子查询放在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 

也许更好的选择是使用SUMwith 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 演示

于 2013-04-01T20:29:49.740 回答