現実とはかけ離れた結果を返すクエリに問題があります (まったく意味がないだけでなく、フィルターを使用して正しい答えを計算することもできます)。
仕事用の KPI データベースを構築しています。このクエリは、期間ごとの従業員ごとの KPI を返します。スプレッドシートを使用して計算した正確な結果を提供する期間ごとにセクターごとに KPI を返す、これが派生した非常によく似たクエリがあります。ここで何が起こるか本当にわかりません。基本的に、maintenances
表にあるtemps_requete_min
、temps_analyse_min
、temps_maj_min
などのいくつかの測定値を合計してからtemps_rap_min
、小計を作成し、これらの測定値を時間として表示します (測定値は分単位で表示されるため、60 で割ります)。
SELECT
[anal].[prenom] & " " & [anal].[nom] AS Analyste,
maint.periode, maint.annee,
Round(Sum(maint.temps_requete_min)/60,2) AS REQ,
Round(Sum(maint.temps_analyse_min)/60,2) AS ANA,
Round(Sum(maint.temps_maj_min)/60,2) AS MAJ,
Round(Sum(maint.temps_rap_min)/60,2) AS RAP,
Round((Sum(maint.temps_requete_min)+Sum(maint.temps_analyse_min)+Sum(maint.temps_maj_min)+Sum(maint.temps_rap_min))/60,2) AS STOTAL,
Count(maint.periode) AS Nombre,
a.description
FROM
rapports AS rap,
analyste AS anal,
maintenances AS maint,
per_annuelle,
annees AS a
WHERE
(((rap.id_anal_maint)=anal.id_analyste) And
((maint.id_fichier)=rap.id_rapport) And
((maint.maint_effectuee)=True) And
((maint.annee)=per_annuelle.annee) And
((per_annuelle.annee)=a.annees))
GROUP BY
[anal].[prenom] & " " & [anal].[nom],
maint.periode,
maint.annee,
a.description,
anal.id_analyste
ORDER BY
maint.annee, maint.periode;
すべての測定値は、本来あるべき値よりも桁違いに高くなっています。Count() が間違っているのではないかと思いますが、合計の何が問題なのかわかりません :|
編集:最後に、コメントで与えられたアドバイスと提供された回答から、Excel を使用して計算したのと同じ測定値を示すこのクエリを思いつきました。皆さんに感謝します。ただし、知りたいのは、暗黙的な結合ではなく明示的な結合を使用することで違いが生じる理由です ( WHERE
PK の句)。
SELECT
maintenances.periode,
[analyste].[prenom] & " " & analyste.nom,
Round(Sum(maintenances.temps_requete_min)/60,2) AS REQ,
Round(Sum(maintenances.temps_analyse_min)/60,2) AS ANA,
Round(Sum(maintenances.temps_maj_min)/60,2) AS MAJ,
Round(Sum(maintenances.temps_rap_min)/60,2) AS RAP,
Round((Sum(maintenances.temps_requete_min)+Sum(maintenances.temps_analyse_min)+Sum(maintenances.temps_maj_min)+Sum(maintenances.temps_rap_min))/60,2) AS STOTAL,
Count(maintenances.periode) AS Nombre
FROM
(maintenances INNER JOIN rapports ON maintenances.id_fichier = rapports.id_rapport)
INNER JOIN analyste ON rapports.id_anal_maint = analyste.id_analyste
GROUP BY analyste.prenom, maintenances.periode