2014-09-02 97 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