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" и "others"
  • код группы "total" представляет общее количество выпускников всех рас
  • тем не менее, multi-race отсутствует, поэтому количество выпускников гонки может не складываться с общим количеством выпускников
  • эти недостающие данные необходимо исчислять с

есть ли в любом случае переписать это, используя производные таблицы или соединения, чтобы получить те же результаты?

обновление: Я создал пример данных и 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 Demo с обоими