1

ユーザーのデータベースと、各アクティビティ カテゴリに費やした時間のクエリを実行したいと考えています。これらのカテゴリは、テーブル 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 でデータをグループ化します。

4

1 に答える 1

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

基本的に、すべてのカテゴリが必要な場合は、そのテーブルを最初のテーブルとして使用し、そのテーブルに対してs をFROM実行する必要があります。LEFT JOIN

更新 結果のすべてのユーザーにすべてのカテゴリが必要な場合は、次のものが必要ですCROSS JOIN

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

WHERE句を追加する場合の問題を解決するには:

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
于 2013-03-15T18:34:07.807 に答える