2014-08-28 28 views
0

我有一個奇怪的情況,並不太確定如何接近它。TSQL多個計數使用不同JOIN的相同表

我有兩張表:

表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 

此問題與此的是,連接是由nomineeQID僅連接,而不是subQID爲好。

我的最終結果,我在找的是:

署客戶服務有25份意見書和90項提名

下令這兩個方面的總和......

我想只是JOIN再次在subQID,但被告知我不能加入同一張桌子兩次。

有沒有更簡單的方法來實現這個目標?

回答

0

這是一個現狀,您需要獨立收集您的計數。當兩個左連接滿足連接條件時,使用兩個左連接將導致某些行在第一次左連接中被計數兩次。您可以使用相關的子查詢或外部應用程序按照不同標準收集計數來解決您的方案。我在這裏沒有提供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 

而現在的OUTER APPLY選項:

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 
+0

的一個大問題,我已經是這個性能。看起來它正在瀏覽整個員工表,然後當它在提交表中發現了它的東西時。 empTable包含超過10K條記錄,所以我想知道這是否會成爲問題。當我在桌子上運行代碼時,它試圖用數據返回每個員工。 – SBB 2014-09-02 15:19:18

+0

啊,我錯過了這個部門。它將不得不重複員工記錄到他們的部門進行分組,並獲得提名/提交數量,但是我對此做了些混亂。看我的編輯。 – 2014-09-02 15:29:42

+0

至於性能,如果empowermentSubmissions.nomineeQID和empowermentSubmissions.locationID在索引中配對,並且empowermentSubmissions.submitterQID和empowermentSubmissions.locationID在索引中配對,則應該非常快速。 10K記錄不應該是一個問題。 – 2014-09-02 15:39:50

相關問題