2

現実とはかけ離れた結果​​を返すクエリに問題があります (まったく意味がないだけでなく、フィルターを使用して正しい答えを計算することもできます)。

仕事用の KPI データベースを構築しています。このクエリは、期間ごとの従業員ごとの KPI を返します。スプレッドシートを使用して計算した正確な結果を提供する期間ごとにセクターごとに KPI を返す、これが派生した非常によく似たクエリがあります。ここで何が起こるか本当にわかりません。基本的に、maintenances表にあるtemps_requete_mintemps_analyse_mintemps_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 を使用して計算したのと同じ測定値を示すこのクエリを思いつきました。皆さんに感謝します。ただし、知りたいのは、暗黙的な結合ではなく明示的な結合を使用することで違いが生じる理由です ( WHEREPK の句)。

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
4

1 に答える 1

3

この場合、問題は通常、結合によって複数のディメンションが結合されていることです。2 つ以上のカテゴリにわたってクロス積を行うことになります。

修正は、各ディメンションに沿って個別に集計を行うことです。つまり、"from" 句には group by を含むサブクエリが含まれており、これらが結合されます。group by は外側のクエリから消えます。

これは、次のようなサブクエリを持つことを提案します。

from (select 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, 
      from maintenances maint
      group by maint.periode, maint.annee
     ) m

「など」と言うのは、テーブルのレイアウトがないと、問題がどこにあり、正確な解決策が何であるかを正確に把握するのが難しいためです。

于 2012-08-02T20:50:45.207 に答える