Можно ли объединить два столбца в один, а затем подсчитать для них значения, как если бы это был один столбец? - PullRequest
2 голосов
/ 09 июня 2011

В настоящее время я использую этот оператор 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

В приведенном выше примере четыре записи, с которыми они работали совместно, зачисляются им обоим. Конечно, это означает, что некоторые записи подсчитываются дважды, но это то, что я хочу для этого приложения.

Я пробовал UNIONS и кучу других вещей, но он либо не дает мне того, что я хочу, так как я хочу, чтобы он отображался, или выдает ошибку без данных. Я знаю, что DISTINCT должен идти, но не уверен, как именно это сделать. Это делается в SQL Server 2008 R2. Помощь

Ответы [ 3 ]

4 голосов
/ 09 июня 2011
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
0 голосов
/ 09 июня 2011
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
0 голосов
/ 09 июня 2011

Лучший способ сделать это, вероятно, с помощью накопительного пакета, который избегает подзапроса и, вероятно, будет работать лучше для больших наборов данных.

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

ROLLUP означает, что общее значение должно быть включено в строку Completed_By, следовательно исключение вспомогательной строки в предложении where.

...