SQL Server "не может выполнять агрегатную функцию для выражения, содержащего агрегат или подзапрос", но Sybase может

Этот вопрос обсуждался ранее, но ни один из ответов не касается моей конкретной проблемы, потому что я имею дело с разными предложениями во внутреннем и внешнем выборе. Этот запрос выполняется просто под 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. Спасибо за помощь, ребята!

Ответ 1

Один из вариантов - поместить подзапрос в 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 с обоими