ユーザーのデータベースと、各アクティビティ カテゴリに費やした時間のクエリを実行したいと考えています。これらのカテゴリは、テーブル ActivityCategory (int ID、varchar Name) に格納されます。そのうちの 8 つしかないので、特定のカテゴリに誰も時間を費やさなかったとしても、すべてを見たいと思っています。
次のクエリがあります。
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 結合のすべての組み合わせを試しました。私が得ることができる最善の方法は、カテゴリが誰も使用されていない場合は完全に null 行であり、特定のユーザーが使用していないが他のユーザーが使用しているカテゴリの場合は null ac.Name です。そのgroup by [...]
ac.Name
部分は、未使用のカテゴリを「食べている」ものだと思います。私は何を間違っていますか?結果をグループ化するために、2 番目の選択クエリを作成する必要がありますか? 似たようなクエリをさらに 10 個ほど作成する予定なので、説明のない固定クエリではなく、理解したいと思います。
EDIT Lamak の 2 番目のクエリはこれまでのところ機能しますが、where 句を追加すると同じ問題が発生します。
EDIT2 ypercubeの編集は完全に機能します
では、クエリを正しく理解しているかどうか見てみましょう。結果がnullになる場合は、Sumを0と合体させて適切な値にします。ActivityCategory から選択を開始して、使用していないものも含めて、それらがすべて揃っていることを確認します。これをユーザーと交差結合して、ActivityCategory とユーザーのすべての組み合わせを作成します。関連する行のみを取得するためにActivitycodesに参加したままにしてから、他のテーブルを内部結合してSemaineに取得します。クロス結合の前にデータをフィルタリングしたいので、私の条件は Semaine テーブルの結合に適用されます。最後に、合計が機能するように、Users と ActivityCategory でデータをグループ化します。