我可以将两列合并为一列,然后为它们计算值就好像是一列一样吗?

Dan*_*Day 2 sql-server group-by count

我目前正在使用此SQL语句返回由谁完成每条记录(RFI)的计数:

SELECT Completed_By, COUNT(DISTINCT Unique_ID) AS RFICount FROM RFI_ 
WHERE Date_Submitted BETWEEN '20110101' AND '20110630' 
GROUP BY Completed_By
Run Code Online (Sandbox Code Playgroud)

这将返回如下数据集:

Completed_By     RFICount
------------     ---------
SMITH, Bob       1
DOE, John        15
WARNER, Jack     11
Run Code Online (Sandbox Code Playgroud)

这就是我想要的样子。但是,某人可以是完成或协助完成记录(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
Run Code Online (Sandbox Code Playgroud)

这将返回以下类型的输出:

Completed_By     Assisting_Analyst     RFICount
------------     -----------------     --------
SMITH, Bob       NULL                  1
DOE, John        NULL                  15
WARNER, Jack     NULL                  7
WARNER, Jack     SMITH, Bob            4
Run Code Online (Sandbox Code Playgroud)

由于鲍勃·史密斯(Bob Smith)为杰克·华纳(Jack Warner)提供了四个记录(RFI),因此将创建一个单独的行。但我只是希望每个人都获得个人荣誉,并将其显示在一个栏中,如下所示:

Completed_By     RFICount
------------     ---------
SMITH, Bob       5
DOE, John        15
WARNER, Jack     11
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,他们共同处理的四个记录归功于两个记录。当然,这意味着一些记录被计算了两次,但这就是我想要的此应用程序的结果。

我已经尝试了UNIONS和其他很多东西,但是它要么没有给我我想要的显示效果,要么给了我没有数据的错误。我知道DISTINCT已经走了,但不确定如何确切地做到这一点。这是在SQL Server 2008 R2中完成的。救命?

Joe*_*lli 5

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
Run Code Online (Sandbox Code Playgroud)