使用Sum()和Count()的MS Access SQL查询给出了错误的结果

时间:2012-08-02 20:43:25

标签: sql ms-access-2007

我遇到了一个查询问题,它返回的结果与现实相差甚远(不仅没有意义,而且还可以使用过滤器计算正确的答案)。

我正在为工作构建KPI数据库,此查询按周期按员工返回KPI。我有一个非常相似的查询,从中可以得到这个查询,它按周期按部门返回KPI,这给出了我使用电子表格计算的确切结果。我真的不知道这里发生了什么。基本上,我想总结maintenances表中的一些度量,例如temps_requete_mintemps_analyse_mintemps_maj_mintemps_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计算的相同措施。非常感谢大家。然而,我想知道的是,为什么在PK上使用显式连接而不是隐式连接(WHERE子句)会有所不同。

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

1 个答案:

答案 0 :(得分:3)

在这种情况下,问题通常是您的联接将多个维度聚集在一起。您最终会跨两个或更多类别进行交叉产品。

修复是在每个维度上独立完成摘要。这意味着“from”子句包含具有group bys的子查询,然后将它们连接在一起。 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

我说“比如”因为没有表格的布局,很难确切地看到问题的确切位置以及确切的解决方案。