2013-03-15 1 views
1

사용자에 대한 데이터베이스 및 각 활동 범주에 소요 한 시간을 쿼리하고 싶습니다. 이러한 범주는 ActivityCategory 테이블 (int Id, varchar Name)에 저장됩니다. 아무도 특정 카테고리에서 시간을 보냈을 때도 그들 중 8 명이 있고 나는 그들 모두를보고 싶습니다.그룹에 null/0 행 포함

select u.NoEmploye, u.FirstName, u.LastName, Total=sum(h.NbHeures), ac.Name 
from Users u 
join Semaines s on u.EntityGuid=s.UserGuid 
join HeuresProjets hp on s.Id=hp.WeekId 
join Heures h on hp.HPId=h.HpGuid 
join ActivityCodes code on h.Code=code.ActivityId 
join ActivityCategory ac on code.Categorie=ac.Id 
group by u.NoEmploye, u.FirstName, u.LastName, ac.Name 
order by u.NoEmploye 

그것은 잘 작동하지만 사용하지 않는 ActivityCategories를 반환하지 않습니다

나는 다음과 같은 쿼리를 가지고있다. 나는 full/left/right/inner/outer/you-name-it 조인의 모든 조합을 시도했다. 내가 얻을 수있는 가장 좋은 방법은 특정 사용자가 사용하지 않지만 다른 사용자가 사용하는 범주에 대해 nobody 및 null ac.Name에서 카테고리를 사용하는 경우 완전히 null 행을 얻는 것입니다. 나는 group by [...]ac.Name 부분이 사용되지 않는 범주를 "먹는"부분이라고 생각합니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까? 결과를 그룹화 할 두 번째 쿼리를 선택 쿼리에 써야합니까? 쓸만한 12 가지 유사한 쿼리가 있으므로 설명이없는 고정 쿼리 대신 이해하고 싶습니다.

편집 Lamak의 두 번째 쿼리는 지금까지 작동하지만 Where 절을 추가하면 동일한 문제가 발생합니다.

EDIT2 ypercube '편집 완벽하게 작동

지금 내가 제대로 쿼리를 이해한다면 보자. 결과가 null 일 때 proprer 값을 갖기 위해 Sum을 0으로 결합합니다. ActivityCategory에서 선택한 항목을 시작하여 사용하지 않는 항목까지 모두 포함되도록합니다. ActivityCategory와 Users의 모든 조합을 갖기 위해 사용자와 조인합니다. 나는 Activitycodes에 가입하여 관련 행을 얻은 다음 내면의 다른 테이블을 Semaine에 연결합니다. Cross join 전에 데이터를 필터링하고 싶기 때문에 내 조건이 Semaine 테이블의 조인에 적용됩니다. 마지막으로, 사용자 및 ActivityCategory별로 데이터를 그룹화하여 합계가 작동하도록합니다.

답변

4

이 수행해야합니다 모든 카테고리를 원하는 경우

SELECT u.NoEmploye, u.FirstName, u.LastName, Total=sum(h.NbHeures), ac.Name 
FROM ActivityCategory ac 
LEFT JOIN ActivityCodes code 
    ON code.Categorie=ac.Id 
LEFT JOIN Heures h 
    ON h.Code=code.ActivityId 
LEFT JOIN HeuresProjets hp 
    ON hp.HPId=h.HpGuid 
LEFT JOIN Semaines s 
    ON s.Id=hp.WeekId 
LEFT JOIN Users u 
    ON u.EntityGuid=s.UserGuid 
GROUP BY u.NoEmploye, u.FirstName, u.LastName, ac.Name 
ORDER BY u.NoEmploye 

기본적으로 해당 테이블에 LEFT JOIN의 당신의 FROM의 첫 번째 테이블로 해당 테이블을 사용 할 필요가있다. 당신이 당신의 결과에 대한 모든 사용자에 대한 모든 범주를 원하는 경우

UPDATE , 당신은 필요거야 CROSS JOIN :

: 당신이 WHERE 절을 추가 할 때

SELECT u.NoEmploye, u.FirstName, u.LastName, Total=sum(h.NbHeures), ac.Name 
FROM ActivityCategory ac 
CROSS JOIN Users u 
LEFT JOIN ActivityCodes code 
    ON code.Categorie=ac.Id 
LEFT JOIN Heures h 
    ON h.Code=code.ActivityId 
LEFT JOIN HeuresProjets hp 
    ON hp.HPId=h.HpGuid 
LEFT JOIN Semaines s 
    ON s.Id=hp.WeekId AND u.EntityGuid=s.UserGuid 
GROUP BY u.NoEmploye, u.FirstName, u.LastName, ac.Name 
ORDER BY u.NoEmploye 

이 문제를 해결하려면

SELECT u.NoEmploye, u.FirstName, u.LastName, 
     Total=COALESCE(SUM(h.NbHeures),0), ac.Name 
FROM ActivityCategory ac 
CROSS JOIN Users u 
LEFT JOIN 
     ActivityCodes code 
     JOIN Heures h 
      ON h.Code=code.ActivityId 
     JOIN HeuresProjets hp 
      ON hp.HPId=h.HpGuid 
     JOIN Semaines s 
      ON s.Id=hp.WeekId 
      AND (some condition on the dates)   -- add here 
    ON ac.Id = code.Categorie 
    AND u.EntityGuid = s.UserGuid 
GROUP BY u.NoEmploye, u.FirstName, u.LastName, ac.Name 
ORDER BY u.NoEmploye 
+0

당신의 논리는 옳은 것 같지만 쿼리를 실행할 때 SQL Server는 null 사용자 데이터가있는 8 행 (각 카테고리 당 1 개)을 리턴합니다. 결과는 0 이외에 – 0xFF

+0

입니다. 그리고 사용자는 아직 사용하지 않은 카테고리에 대해 행을 가지고 있지 않습니다. – 0xFF

+0

@fhlamarche. 나는 당신이 나에게 (그리고 다른 사용자들에게) 더 나은 대답을 제공하기 위해 몇 가지 샘플 데이터와 예상 결과를 게시 할 필요가 있다고 생각한다. – Lamak

관련 문제