2014-08-28 2 views
0

나는 이상한 상황에 처해 있으며 그 방법에 대해 너무 자세하지 않습니다.TSQL 서로 다른 JOIN으로 같은 테이블을 사용하여 여러 번 계산

내가 2 개 별도의 테이블이 있습니다

표 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 

이 문제 만이 아니라 subQID뿐만 아니라 nomineeQID에 의해 합류 가입하기 때문이다.

내가 찾고 있어요 내 최종 결과는 다음과 같습니다

부서의 고객 서비스는 25 장의 사진과 90 개 후보 모두 계산의 합에 의해 주문

을 가지고 ...

난 그냥 JOIN 다시하려 subQID에 있지만 같은 테이블에 두 번 가입 할 수 없다고 들었습니다.

더 쉬운 방법이 있나요?

답변

0

이것은 독자적으로 카운트를 수집해야하는 상황입니다. 두 개의 왼쪽 조인을 사용하면 두 조인 조건이 충족 될 때 첫 번째 왼쪽 조인에서 일부 행이 두 번 계산됩니다. 상관 관계가있는 부질의를 사용하거나 다른 적용 기준에 따라 카운트를 적용하여 시나리오를 해결할 수 있습니다. 여기에 COUNT(CASE ...) 옵션이 없습니다. 데이터에 어느 쪽이나 시나리오가 없기 때문에 직원 테이블에 두 개의 외래 키가 있습니다. 따라서, 샘플 데이터를 설정 :

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

내가 가진 하나의 큰 문제는이 성능이다. 전체 employeeTable을보고있는 것처럼 보이고 제출 테이블에서 무언가를 찾으면 그 일을합니다. empTable에는 10,000 개가 넘는 레코드가 포함되어 있으므로 문제가 될지 궁금합니다. 테이블에서 코드를 실행하면 데이터가있는 모든 직원을 반환하려고했습니다. – SBB

+0

아, 나는 부서를 놓쳤다. 어쨌든 부서별로 그룹화하기 위해 직원 기록을 반복해야하고 지명/제출 횟수를 받는다. 내 편집을 참조하십시오. –

+0

성능에 관해서는 empowermentSubmissions.nomineeQID 및 empowermentSubmissions.locationID가 인덱스에서 쌍으로 구성되고 empowermentSubmissions.submitterQID 및 empowermentSubmissions.locationID가 인덱스에서 쌍으로 구성되는 경우이 작업이 정말 빠르다. 10K 기록은 문제가되어서는 안됩니다. –

관련 문제