подзапрос tsql distinct count

#tsql #subquery #distinct

#tsql #подзапрос #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. Просто чтобы убедиться, что я понимаю, в этом запросе вы хотите вывести количество различных значений EVENT_NAME, соответствующих каждой отдельной комбинации A.Program, A.PEOPLE_ID, A.Program2 и A.Program3?

Ответ №1:

Здесь вы хотите использовать предложение 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
  

Если вам нужно объединить результаты запросов в единый набор результатов, вы должны быть в состоянии сделать это с помощью ОБЪЕДИНЕНИЯ.

Комментарии:

1. Мне нравится ваше решение, Брент, но мне нужно включить еще много полей в дополнение к этим двум различным подсчетам для этого (единственного) результирующего набора. Как бы я это сделал?

2. Если эти поля являются агрегированными (COUNT, MIN, MAX и т.д.), То их можно просто добавить в список ВЫБОРА. Если они имеют ту же степень детализации, что и поле группировки (например, A.PEOPLEID), добавьте их в предложение SELECT, а также в предложение GROUP BY .

3. Не могли бы вы дать мне больше указаний? Эти дополнительные поля имеют ту же степень детализации, что и поле группировки. Но теперь я получаю сообщение об ошибке:

4. Сообщение 512, уровень 16, состояние 1, строка 58 Подзапрос вернул более 1 значения. Это не разрешено, когда подзапрос следует =, !=, <, <= , >, >= или когда подзапрос используется как выражение.

5. Обновите свой пост последним запросом.