#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. Обновите свой пост последним запросом.