2011-10-05 66 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