2011-10-05 62 views
0

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

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。

+0

为了确保我明白,在此查询中,您希望输出与A.Program,A.PEOPLE_ID,A.Program2和A.Program3的每个不同组合对应的不同EVENT_NAME值的计数? –

回答

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进行此操作。

+0

我喜欢你的解决方案,布伦特,但我需要包括更多的领域,除了这(单)结果集这两个不同的计数。我会怎么做? – salvationishere

+0

如果这些字段是聚合(COUNT,MIN,MAX等),那么它们可以简单地添加到SELECT列表中。如果它们与分组字段具有相同的粒度(例如A.PEOPLEID),则将它们添加到SELECT子句以及GROUP BY子句中。 –

+0

你能给我更多的指导吗?这些附加字段与分组字段具有相同的粒度。但是现在我收到错误: – salvationishere