2014-09-02 85 views
0

我有一張表,我試圖從2個左連接的相同數據中獲得2個不同的計數。TSQL加入多個表的表格

無論出於何種原因,它是複製數據並提供不正確的結果,我不知道爲什麼。

這是我迄今爲止查詢我本以爲這是工作:

DECLARE @locale INT = '14' 

SELECT TOP 50 
    E.[DepartmentDesc] AS department, 
    COUNT(N.[nomineeQID]) AS totalNominations, 
    COUNT(S.[subQID]) AS totalSubmissions, 
    COUNT(N.[nomineeQID]) + COUNT(S.[subQID]) AS total 
FROM 
    employees AS E 
LEFT JOIN 
    submissions AS S ON E.[qid] = S.[subQID] AND S.[statusID] = 3 
         AND S.[locationID] = @locale 
LEFT JOIN 
    submissions AS N ON E.[qid] = N.[nomineeQID] AND N.[statusID] = 3 
        AND N.[locationID] = @locale 
GROUP BY 
    E.[DepartmentDesc] 
ORDER BY 
    totalNominations DESC 

下面是數據的SQL小提琴:http://sqlfiddle.com/#!3/4e6b5/1

結果應該是下面的,但它是提供偏斜的數字:

  • 總提名應該是3
  • 總提交應該是2
  • 總計應爲5

我有一種感覺,它的接近,但數學只是不配合!

任何想法?

+0

檢查我的答案;)我想沒關係 – 2014-09-02 14:29:07

+0

我已經更新了我的答案以削減0/0行,顯示sqlfiddle爲o – 2014-09-02 14:35:52

+0

我再次更新了有關按部門分類的答案。也顯示sqlfiddle;) – 2014-09-02 14:45:19

回答

0

試試這個:

DECLARE @locale INT = '14' 

select TOP 50 t.department, sum(t.totalSubmissions), 
sum(t.totalNominations), sum(t.total) 
from 
(SELECT 
    E.[DepartmentDesc] AS department, 

    (select COUNT(S.[subQID]) 
    from submissions AS S 
    where E.[qid] = S.[subQID] 
    AND S.[statusID] = 3 
    AND S.[locationID] = @locale) AS totalSubmissions, 

    (select COUNT(N.[nomineeQID]) 
    from submissions AS N 
    where E.[qid] = N.[nomineeQID] 
    AND N.[statusID] = 3 
    AND N.[locationID] = @locale) AS totalNominations, 

    (select COUNT(S.[subQID]) 
    from submissions AS S 
    where E.[qid] = S.[subQID] 
    AND S.[statusID] = 3 
    AND S.[locationID] = @locale) + 
    (select COUNT(N.[nomineeQID]) 
    from submissions AS N 
    where E.[qid] = N.[nomineeQID] 
    AND N.[statusID] = 3 
    AND N.[locationID] = @locale) AS total 

FROM employees AS E 
where exists(
    select 'submission' 
    from submissions AS S 
    where E.[qid] = S.[subQID] 
    AND S.[statusID] = 3 
    AND S.[locationID] = @locale 
) or 
exists(
select 'nomination' 
from submissions AS N 
where E.[qid] = N.[nomineeQID] 
AND N.[statusID] = 3 
AND N.[locationID] = @locale 
) 
) as t 
group by t.department 
ORDER BY sum(t.totalNominations) DESC 

轉到SqlFiddle

+0

這很接近,但我不想包含員工表中不屬於此查詢的其他員工。 http://sqlfiddle.com/#!3/7ae03/1 – SBB 2014-09-02 14:31:08

+0

如果現在有一種簡單的方法來組合,那麼這應該是完美的 - 當所有相同的部門需要分組在一起時,它多次顯示同一部門 – SBB 2014-09-02 14:38:41

+0

該演示正常工作正常;我的代碼仍然只是返回重複的部門;儘管謝謝! – SBB 2014-09-02 14:57:45

1

您正在爲每個部門獲得笛卡爾產品。您查詢的最簡單的解決辦法是使用count(distinct)

    COUNT(DISTINCT N.[nomineeQID]) AS totalNominations, 
        COUNT(DISTINCT S.[subQID])  AS totalSubmissions, 
        COUNT(DISTINCT N.[nomineeQID]) + COUNT(DISTINCT S.[subQID]) AS total 

更正確的解決方法是做join之前做子查詢中的聚合。

編輯:

因爲重複的問題,使用SubmissionId代替:

    COUNT(DISTINCT N.SubmissionId) AS totalNominations, 
        COUNT(DISTINCT S.SubmissionId)  AS totalSubmissions, 
        COUNT(DISTINCT N.SubmissionId) + COUNT(DISTINCT S.SubmissionId) AS total 
+0

雖然問題是允許在提交表中重複。一個人可以多次提名或提交多個項目。做清楚不會給我一個正確的數字。 – SBB 2014-09-02 14:26:35