Перво-наперво, давайте покончим с этими неприятными подзапросами и преобразуем ваш запрос в CTE (непроверенный, поскольку я не могу видеть вашу схему):
WITH EventCounts ( casCaseID, EventCount )
AS ( SELECT evecaseid ,
COUNT(evecaseid)
FROM MPS3.dbo.Events
WHERE eveworkflowid = 960
),
ClientToCaseCounts ( casCaseID, ClientToCaseCount )
AS ( SELECT CTC1.ctcCaseID ,
COUNT(CTC2.ctcCaseID)
FROM MPS3.dbo.ClientToCase CTC1
INNER JOIN MPS3.dbo.ClientToCase CTC2 ON CTC1.ctcClientID = CTC2.ctcClientID
INNER JOIN MPS3.dbo.Events E2 ON CTC2.ctcCaseID = E2.eveCaseID
AND E2.eveWorkflowID = 960
WHERE CTC2.ctcCaseID < CTC1.ctcCaseID
),
BaseData ( [casCaseID], [casPrimaryClientID], [FPCategory] )
AS ( SELECT [casCaseID] ,
[casPrimaryClientID] ,
CASE WHEN EventCounts.EventCount > 0 THEN 1
WHEN ClientToCaseCounts.ClientToCaseCount > 0 THEN 2
ELSE 3
END AS [FPCategory]
FROM [MPS3].[dbo].[Cases] C
LEFT OUTER JOIN EventCounts ON C.[casCaseID] = EventCounts.casCaseID
LEFT OUTER JOIN ClientToCaseCounts ON C.[casCaseID] = ClientToCaseCounts.casCaseID
WHERE casRecontactDate BETWEEN '2012-01-01'
AND '2012-01-01'
AND casCaseType = 'm'
)
SELECT [FPCategory] ,
COUNT([casCaseID]) AS TotalCases
FROM BaseData
GROUP BY [FPCategory]
Теперь, я заметил вас, где группировка по FPCategory в вашем последнем запросе подразумевает, что ваши результаты будут иметь несколько casCaseID для каждой FPCategory? Я не уверен на 100%, что вы хотите усреднить? но теперь это CTE, вы можете присоединить EventCounts & ClientToCaseCounts к окончательному запросу (рекурсия). Надеюсь, что это направит вас в правильном направлении, если нет, предоставьте несколько примеров схем и примеров данных, и я соответствующим образом подправлю свой ответ.