Могу ли я объединить два столбца в один, а затем посчитать значения для них, как если бы это был один столбец?

#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