如何为总计数制定TSQL CTE表达式?

时间:2013-05-09 14:18:14

标签: sql-server tsql group-by common-table-expression

我有一个包含原始数据的表,我希望从中返回不同的people_id计数。如果计数有不同的分组,我怎样才能在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与program_modifier_id和license_number。第二个问题是使用上面的TSQL代码,我必须通过program_modifier_id和license_number进行分组,以便在WHERE子句中包含license_number。但是我不希望在license_Number上对该计数进行细分。无论license_number如何,我只想要总计数。如何修改此TSQL查询以实现所需的计数?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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)