2012-06-28 2 views
0

레코드에서 권한이 부여 된 사람에게 적어도 모든 레코드 수를 얻으려고합니다. 기본적으로 레코드에는 둘 이상의 사람이 연관 될 수 있습니다. 총 레코드 수, 최소 한 명이 승인 된 총 승인 레코드 수 및 레코드와 연관된 사람이 승인되지 않은 총 NotAuthorized 레코드 수를 반환하고 싶습니다. 한 사람이 기록 당 권한을 부여 받았는지 또는 기록에 대해 3 명의 사람이 권한을 부여 받았는지 여부는 중요하지 않습니다.이 경우 권한있는 카운터에 1을 추가해야합니다.왼쪽 외부 조인이있는 열의 합계

현재 쿼리는 레코드 당 하나씩이 아닌 레코드 당 추가 된 각 사람에 대해 Auth 및 Non auth를 증가시킵니다. Not Auth로 계산해야하는 레코드에 할당 된 사람이없는 경우.

SELECT Count(DISTINCT Record.RecordID) AS TotalRecords, 
SUM(CASE WHEN People.PersonLevel = 1 THEN 1 ELSE 0 END) AS Authorized, 
SUM(CASE WHEN People.PersonLevel <> 1 THEN 1 ELSE 0 END) AS NotAuthorized 
FROM Record 
LEFT OUTER JOIN RecordPeople ON Record.RecordID = RecordPeople.RecordID 
LEFT OUTER JOIN People ON RecordPeople.PersonID = People.PersonID 

답변

0

그런 것처럼 보이는 것은 추악한 (테스트되지 않은) 것으로 보이지만 더 좋아야합니다. 당신이 기록에 의해 (적어도 하나는 허가 또는 합산되지 않음) 요약해야하기 때문에

, 나는이 단지에 추가 NULL 값을 해결

SELECT 
    COUNT(a.record) AS TotalRecords, 
    SUM(a.authorizedRecord), 
    SUM(a.nonAuthorizedRecord) FROM 
    (SELECT 
     r.RecordId AS record, 
     CASE WHEN SUM(CASE WHEN p.PersonLevel = 1 THEN 1 ELSE 0 END) >= 1 THEN 1 ELSE 0 END AS authorizedRecord, 
     CASE WHEN SUM(CASE WHEN COALESCE(p.PersonLevel, 0) <> 1 THEN 1 ELSE 0)>=1 THEN 1 ELSE 0 END AS nonAuthorizedRecord 
    FROM Record r 
    LEFT OUTER JOIN RecordPeople ON Record.RecordID = RecordPeople.RecordID 
    LEFT OUTER JOIN People ON RecordPeople.PersonID = People.PersonID 
    GROUP BY r.RecordId 
    ) AS a 
+0

... 당신이 부질없이 그것을 얻을 수 있다고 생각하지 않습니다 승인되지 않은 수 내가 공인 된 사람이 아닌 사람을 동일한 레코드에 추가하면 전체 수는 1이 아닌 2로 증가합니다. – Matt

+0

@Matt 죄송합니다. 너무 빨리 읽은 것으로 보입니다. 나는 더 천천히 읽을 것이다! –