2013-05-09 3 views
1

У меня есть таблица с необработанными данными, из которых я хочу вернуть отличные числа people_id. Как я могу сделать это в CTE, если подсчеты имеют разные группировки? Вот то, что я до сих пор:Как сформулировать выражение TSQL CTE для общего подсчета?

;with cte as 
    (select 
     program_modifier_id, program_modifier, people_id, group_profile_id, 
     current_status, license_number, is_managing_office, 
     program_info, program_name, program_code, group_profile_type_id 
    From 
    #enrollments en with (nolock)) 
SELECT 'TN - Level 4', 
    CASE WHEN (program_modifier_id = 'E1AA7A36-0500-4BAE-A0AA-D9E0BC91A6F3') 
     THEN COUNT(DISTINCT people_id) END AS 'Total Ct' 
from cte 
group by program_modifier_id 
    UNION 

SELECT 'TN - Level 3 CE - RTC', 
    CASE WHEN (program_modifier_id = '213D080F-E340-44B6-AC8C-4233D1193602' 
         AND license_number like '%-RTC-%') 
     THEN COUNT(DISTINCT people_id) END AS 'Total Ct' 
from cte 
group by program_modifier_id, license_number 

Выход из этого:

TN - Level 3 CE - RTC 49 
TN - Level 3 CE - RTC 38 
TN - Level 4 56 
TN - Level 3 CE - RTC 7 
TN - Level 3 CE - RTC 24 
TN - Level 3 CE - RTC NULL 
TN - Level 4 NULL 

Но я хочу выход выглядеть следующим образом:

TN - Level 3 CE - RTC 118 
TN - Level 4 56 

Так что проблема два раза , Во-первых, некоторые из этих показателей включают более одного условия в предложение WHERE. Например, program_modifier_id vs. program_modifier_id и license_number. Вторая проблема заключается в том, что, используя вышеприведенный TSQL-код, мне нужно сгруппировать как program_modifier_id AND license_number, чтобы включить номер лицензии в предложение WHERE. Но я не хочу разбивки на этот счет на license_Number. Мне просто нужен общий счет, независимо от номера лицензии. Как я могу изменить этот запрос TSQL для достижения желаемых показателей?

ответ

1
;with cte as 
    (select 
     program_modifier_id, program_modifier, people_id, group_profile_id, 
     current_status, license_number, is_managing_office, 
     program_info, program_name, program_code, group_profile_type_id 
    From 
    #enrollments en with (nolock)) 

Select Description,SUM([Total Ct]) as [Total Ct] from 
( 
SELECT 'TN - Level 4' as Description, 
    CASE WHEN (program_modifier_id = 'E1AA7A36-0500-4BAE-A0AA-D9E0BC91A6F3') 
     THEN COUNT(DISTINCT people_id) END AS 'Total Ct' 
from cte 
group by program_modifier_id 
) a Group by Description 

UNION 

Select Description,SUM([Total Ct]) from 
( 
SELECT 'TN - Level 3 CE - RTC'as Description, 
    CASE WHEN (program_modifier_id = '213D080F-E340-44B6-AC8C-4233D1193602' 
         AND license_number like '%-RTC-%') 
     THEN COUNT(DISTINCT people_id) END AS 'Total Ct' 
from cte 
group by program_modifier_id, license_number 
) a Group by Description 
0

Спасибо. Это оказалось очень просто! Это было моим решением:

;with cte as (
select 
* 
From 
    #enrollments en with (nolock) 
) 

SELECT 'TN - Level 4 TOTAL', count(distinct people_id) from #enrollments where program_modifier_id = 'E1AA7A36-0500-4BAE-A0AA-D9E0BC91A6F3' AND group_profile_id in ('3EC657F7-655F-43FB-8424-2A8914E7C725','9D1628F0-CF85-464C-815A-8660AF60978F','D7C59915-067A-4A03-8B8C-23783568C8D3') AND (@Status is NULL OR current_status = @Status) 
UNION 
SELECT 'TN - Level 4 IH', count(distinct people_id) from #enrollments where program_modifier_id = 'E1AA7A36-0500-4BAE-A0AA-D9E0BC91A6F3' AND group_profile_id = 'D7C59915-067A-4A03-8B8C-23783568C8D3' AND (@Status is NULL OR current_status = @Status) 
UNION 
SELECT 'TN - Level 4 CIRT', count(distinct people_id) from #enrollments where program_modifier_id = 'E1AA7A36-0500-4BAE-A0AA-D9E0BC91A6F3' AND group_profile_id = '3EC657F7-655F-43FB-8424-2A8914E7C725' AND (@Status is NULL OR current_status = @Status) 
Смежные вопросы