Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
TSQL使用具有不同联接的同一表进行多次计数_Sql_Sql Server_Sql Server 2008_Stored Procedures_Join - Fatal编程技术网

TSQL使用具有不同联接的同一表进行多次计数

TSQL使用具有不同联接的同一表进行多次计数,sql,sql-server,sql-server-2008,stored-procedures,join,Sql,Sql Server,Sql Server 2008,Stored Procedures,Join,我有一个奇怪的情况,不太确定如何处理它 我有两张单独的桌子: 表A是提交的材料 id submitterQID nomineeQID story 表B为雇员人数 QID Name Department 我正试图获得按部门分组的提交书总数以及提名总数 这就是我的存储过程的样子: BEGIN SELECT TOP 50 count(A.[nomineeQID]) AS totalNominations,

我有一个奇怪的情况,不太确定如何处理它

我有两张单独的桌子:

表A是提交的材料

id
submitterQID
nomineeQID
story
表B为雇员人数

QID
Name
Department
我正试图获得按部门分组的提交书总数以及提名总数

这就是我的存储过程的样子:

BEGIN
                SELECT   TOP 50 count(A.[nomineeQID]) AS totalNominations,
                                count(A.[subQID]) AS totalSubmissions,
                                B.[DepartmentDesc] AS department
                FROM     empowermentSubmissions AS A
                JOIN empTable AS B
                ON B.[qid] = A.[nomineeQID]
                WHERE A.[statusID] = 3
                AND A.[locationID] = @locale
                GROUP BY B.[Department]
                ORDER BY totalNominations DESC
                FOR      XML PATH ('data'), TYPE, ELEMENTS, ROOT ('root');
            END
这个问题是联接仅由
指定的QID
联接,而不是
子QID
联接

我期待的最终结果是:

部门客户服务部有25份意见书和90份提名

按两个计数之和排序

我试图在
subQID
上再次加入
JOIN
,但被告知不能在同一个表上加入两次


有没有更简单的方法来实现这一点

在这种情况下,您需要彼此独立地收集计数。使用两个左联接将导致当两个联接都满足联接条件时,在第一个左联接中对某些行计数两次。您的场景可以使用相关子查询或外部应用程序来解决,该应用程序收集不同条件下的计数。我没有在这里提供一个
COUNT(CASE…
选项,因为数据中没有非此即彼的场景,您有两个外键指向employees表。因此,设置示例数据:

declare @empowermentSubmissions table (submissionID int primary key identity(1,1), submissionDate datetime, nomineeQID INT, submitterQID INT, statusID INT, locationID INT)
declare @empTable table (QID int primary key identity(1,1), AreaDesc varchar(10), DepartmentDesc varchar(20))
declare @locale INT = 0
declare @n int = 1

while @n < 50
begin
    insert into @empTable (AreaDesc, DepartmentDesc) values ('Area ' + cast((@n % 2)+1 as varchar(1)), 'Department ' + cast((@n % 4)+1 as varchar(1)))
    set @n = @n + 1
end
set @n = 1
while @n < 500
begin
    insert into @empowermentSubmissions (submissionDate, nomineeQID, submitterQID, StatusID, locationID) values (dateadd(dd,-(cast(rand()*600 as int)),getdate()), (select top 1 QID from @empTable order by newid()), (select top 1 QID from @empTable order by newid()), 3 + (@n % 2) - (@n % 3), (@n % 2) )
    set @n = @n + 1
end

我的一个大问题是在这方面的表现。它似乎在浏览整个employeeTable,然后当它在submissions表中找到某个内容时,它就完成了自己的工作。empTable包含超过10k的记录,所以我想知道这是否会成为一个问题。当我在我的表格上运行代码时,它试图将数据返回给每个员工。啊,我错过了部门。无论如何,它都必须重复员工记录,按部门分组,并获得提名/提交数量,但我在这方面做得很糟糕。请参阅我的编辑。至于性能,如果在索引中配对empowermentSubmissions.NamedQid和empowermentSubmissions.locationID,并且在索引中配对empowermentSubmissions.submitterQID和empowermentSubmissions.locationID,这应该会非常快。10K记录不应该成为问题。
SELECT TOP 50 E.DepartmentDesc, SUM(N.Nominations) Nominations, SUM(S.TotalSubmissions) TotalSubmissions
FROM @empTable E
    OUTER APPLY (
        SELECT COUNT(submissionID) Nominations
        FROM @empowermentSubmissions A
        WHERE A.statusID = 3
            AND A.nomineeQID = E.QID
            AND A.locationID = @locale
    ) N
    OUTER APPLY (
        SELECT COUNT(submissionID) TotalSubmissions
        FROM @empowermentSubmissions A
        WHERE A.statusID = 3
            AND A.submitterQID = E.QID
            AND A.locationID = @locale
    ) S
GROUP BY E.DepartmentDesc
ORDER BY SUM(Nominations) + SUM(TotalSubmissions) DESC