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 с обоими