#sql-server #count #group-by
#sql-server #подсчитайте #группировка по
Вопрос:
В настоящее время я использую этот оператор SQL для возврата количества завершивших каждую запись (RFI):
SELECT Completed_By, COUNT(DISTINCT Unique_ID) AS RFICount FROM RFI_
WHERE Date_Submitted BETWEEN '20110101' AND '20110630'
GROUP BY Completed_By
Это возвращает набор данных, подобный следующему:
Completed_By RFICount
------------ ---------
SMITH, Bob 1
DOE, John 15
WARNER, Jack 11
Вот как я хочу, чтобы это выглядело. Однако кто-то может быть основным или второстепенным лицом, которое завершило запись или помогало в завершении записи (RFI). Я хочу показать все это в одном столбце, независимо от того, завершили ли они запись (Completed_By) или помогли с ней (Assisting_Analyst).
Когда я использую следующий оператор SQL, он показывает их как отдельные, когда их нужно объединить:
SELECT Completed_By, Assisting_Analyst, COUNT(DISTINCT Unique_ID) AS RFICount
FROM RFI_ WHERE Date_Submitted BETWEEN '20110101' AND '20110630'
GROUP BY Completed_By, Assisting_Analyst
Это возвращает следующий тип выходных данных:
Completed_By Assisting_Analyst RFICount
------------ ----------------- --------
SMITH, Bob NULL 1
DOE, John NULL 15
WARNER, Jack NULL 7
WARNER, Jack SMITH, Bob 4
Поскольку Боб Смит помогал Джеку Уорнеру с четырьмя записями (RFI), создается отдельная строка. Но я просто хочу, чтобы каждый получал индивидуальный кредит и отображал его в одном столбце, вот так:
Completed_By RFICount
------------ ---------
SMITH, Bob 5
DOE, John 15
WARNER, Jack 11
В приведенном выше примере четыре записи, над которыми они работали совместно, относятся к ним обеим. Конечно, это означает, что некоторые записи подсчитываются дважды, но это то, что я хочу для этого приложения.
Я пробовал ОБЪЕДИНЕНИЯ и кучу других вещей, но это либо не дает мне того, что я хочу, чтобы это отображалось, либо выдает ошибку без данных. Я знаю, что DISTINCT должен быть удален, но не уверен, как именно это сделать. Это делается в SQL Server 2008 R2. Справка?
Комментарии:
1. Возможно ли, чтобы кто-то отображался как второй помощник в некоторых строках (как
Assising_analyst
) и НЕ отображался как первый помощник (какCompleted_By
) ни в одной строке?2. Это крайне маловероятно, но да, это возможно.
3. Тогда моя первая попытка не будет их учитывать: (
Ответ №1:
SELECT t.Completed_By, COUNT(DISTINCT t.Unique_ID) AS RFICount
FROM (SELECT Completed_By, Unique_ID
FROM RFI_
WHERE Date_Submitted BETWEEN '20110101' AND '20110630'
UNION ALL
SELECT Assisting_Analyst AS Completed_By, Unique_ID
FROM RFI_
WHERE Date_Submitted BETWEEN '20110101' AND '20110630'
AND Assisting_Analyst IS NOT NULL) t
GROUP BY t.Completed_By
Ответ №2:
Вероятно, лучший способ сделать это с помощью свертки, которая позволяет избежать подзапроса и, вероятно, будет лучше работать с большими наборами данных.
SELECT Completed_By, Assisting_Analyst, COUNT(DISTINCT Unique_ID) AS RFICount
FROM RFI_ WHERE Date_Submitted BETWEEN '20110101' AND '20110630'
AND Assisting_Analyst IS NULL and Completed_By IS NOT NULL
GROUP BY Completed_By, Assisting_Analyst WITH ROLLUP
Накопительный пакет означает, что общее значение должно быть включено в строку Completed_By, отсюда исключение вспомогательной строки в предложении where.
Комментарии:
1. Я думаю, важно отметить, что этот запрос добавит дополнительную отправку следующей информации: Completed_By Assisting_Analyst RFICount ———— —————— ——— SMITH, Bob NULL 1 DOE, John NULL 15 WARNER, Jack NULL 7 WARNER, Jack SMITH, Bob 4 WARNER, Jack All 11 All SMITH, Bob 4 И, по-видимому, код форматирования у меня сейчас не работает…
2. Вы уверены в этом? Если вы посмотрите на предложение where, оно явно предотвращает возврат самых низких групп (т. Е. те, где добавление вызывает Assisting Analyst.) Он никогда не вернет завершающую вспомогательную пару., только завершающий промежуточный итог.
3. Я думаю, что ваш запрос никогда не вернет никаких записей, где был вспомогательный аналитик (он будет просматривать только строки, где был только основной аналитик) В конечном итоге учетная запись Джека Уорнера будет отображаться как имеющая 7 завершенных записей, а не полные 11.
Ответ №3:
SELECT a.Completed_By
, COUNT(DISTINCT a.Unique_ID)
( SELECT COUNT(DISTINCT b.Unique_ID)
FROM RFI_ b
WHERE b.Date_Submitted BETWEEN '20110101' AND '20110630'
AND b.Assisting_Analyst = a.Completed_By
)
AS RFICount
FROM RFI_ a
WHERE a.Date_Submitted BETWEEN '20110101' AND '20110630'
GROUP BY a.Completed_By
Еще одна попытка:
SELECT COALESCE(first.Completed_By, second.Assisting_Analyst)
AS Completed_By
, COALESCE(first.RFICount,0) COALESCE(second.RFICount,0)
AS RFICount
FROM
( SELECT Completed_By
, COUNT(DISTINCT Unique_ID) AS RFICount
FROM RFI_
WHERE Date_Submitted BETWEEN '20110101' AND '20110630'
GROUP BY Completed_By
) AS first
FULL JOIN
( SELECT Assisting_Analyst
, COUNT(DISTINCT Unique_ID) AS RFICount
FROM RFI_
WHERE Date_Submitted BETWEEN '20110101' AND '20110630'
GROUP BY Assisting_Analyst
) AS second
ON first.Completed_By = second.Assisting_Analyst