tsql distinct count子查询

时间:2011-10-05 14:01:17

标签: tsql subquery distinct

我正在使用SSMS 2008,我需要使用子查询来返回唯一记录/客户端的计数。我该怎么做呢?目前,我将返回整个数据集的所有唯一记录,而不是每个客户端。这是我目前的伪代码:

    SELECT A.Program, A.PEOPLE_ID, K.EVENT_NAME, A.Program2, A.Program3
     (SELECT COUNT(DISTINCT K.EVENT_NAME) 
     FROM #TEMP1 A, evolv_cs.dbo.facility_view F, evolv_cs.dbo.people_x N, event_view K WITH (NOLOCK)
     WHERE F.group_profile_id = A.group_profile_id AND 
        K.event_definition_id = a.event_definition_id AND
        A.people_id = N.people_id
     GROUP BY K.EVENT_NAME) as DistinctEvent
     FROM #TEMP1 A
     JOIN event_view K WITH (NOLOCK) on K.event_definition_id = A.event_definition_id
     WHERE @START_DATE BETWEEN A.Enrolled_Date AND DATEADD(D, 14, A.Enrolled_Date)
     AND (@SERVICE IS NULL OR @SERVICE = K.event_name)
 GROUP BY 
A.Program, A.PEOPLE_ID, K.EVENT_NAME, A.Program2, A.Program3

好的,我现在编辑了上面的查询。我仍然希望每个客户端使用event_name。

1 个答案:

答案 0 :(得分:2)

这里要使用的是您的非重复计数的GROUP BY子句,而不是连接的子查询。以下两个查询应该可以满足您的需求。

SELECT A.PEOPLE_ID, COUNT(DISTINCT K.EVENT_NAME)
   FROM #TEMP1 A, event_view K WITH (NOLOCK)
   WHERE K.event_definition_id = a.event_definition_id
         AND @START_DATE BETWEEN A.Enrolled_Date AND DATEADD(D, 14, A.Enrolled_Date)
         AND (@SERVICE IS NULL OR @SERVICE = K.event_name)
   GROUP BY A.PEOPLE_ID

SELECT K.EVENT_NAME, COUNT(DISTINCT A.PEOPLE_ID)
   FROM #TEMP1 A, event_view K WITH (NOLOCK)
   WHERE K.event_definition_id = a.event_definition_id
         AND @START_DATE BETWEEN A.Enrolled_Date AND DATEADD(D, 14, A.Enrolled_Date)
         AND (@SERVICE IS NULL OR @SERVICE = K.event_name)
   GROUP BY K.EVENT_NAME

如果您需要将查询结果合并到一个结果集中,您应该能够使用UNION。