DISTINCT SUM的MYSQL问题

时间:2011-10-31 20:26:09

标签: php mysql sum distinct report

我们有一个'报告生成器',它基本上根据用户选择的选项构建一系列mysql查询。来自一系列查询的数据用于绘制图形。我们遇到了基于SUM返回错误值的报表。这是查询(我不确定这个网站上是否有代码格式,所以我只是粘贴它):

SELECT DISTINCT SUM( pp.EffectivePrice)
FROM quotes qu
LEFT JOIN plans pl ON pl.ID = qu.planID AND qu.active_quote = '1'
LEFT JOIN plan_procedures pp ON pp.QuoteID = qu.ID AND qu.active_quote = '1'
LEFT JOIN patients pt ON pt.ID = pl.patientID
LEFT JOIN events_log el7881 ON el7881.TreatmentID = pl.ID
LEFT JOIN events_log el9205 ON el9205.TreatmentID = pl.ID
WHERE  el7881.LogDate >= '2011-01-01 00:00:00'  AND ( (el7881.CurrStageID != '5'  AND pt.ID != '')  AND  (el7881.CurrStageID != '19'  AND pt.ID != '') ) AND  (((CAST(pl.surgery_date AS DATE)  BETWEEN '2011-01-01' AND '2011-01-31' AND pl.surgery_date != '') OR (pl.LastSurgeryDate != '0000-00-00 00:00:00' AND CAST(pl.LastSurgeryDate AS DATE)  BETWEEN '2011-01-01 00:00:00' AND '2011-01-31 23:59:59'))  AND pt.ID != '')  AND  el9205.LogDate <= '2011-01-31 23:59:59'  AND ( (el9205.CurrStageID = '4' AND el9205.PrevStageID != '4'  AND pt.ID != '') ) AND  qu.active_quote = '1'  AND ( pl.doctorID = '6'  OR  pl.doctorID = '9'  OR  pl.doctorID = '13' )

查询是由php脚本自动生成的,所以它是复杂的。但这里的问题很简单:为什么,当我运行此查询时,结果值与我运行没有“SUM()”的相同查询时的结果值不同,只需手动添加值即可?当我手动添加它们时,结果是正确的,但是“SUM()”的结果高于它应该的结果。提前感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

SELECT DISTINCT仅返回唯一的行。您的查询即使涉及很多,也只会在使用SUM()版本时返回包含单个字段的单行。

执行SELECT DISTINCT pp.EffectivePrice时,您将删除碰巧具有相同EffectivePrice值的所有行。

所以,给出一些假的返回数据

   $1.00
   $2.00
   $1.00
   $3.00

DISTINCT将隐藏重复的$ 1.00结果,您的金额将为$ 1 + $ 2 + $ 3 = $ 6,现在与实际总金额相差1美元。

答案 1 :(得分:0)

当您选择使用DISTINCT时,您将获得不同的值。任何双打都被删除。因此,如果没有DISTINCT的查询将返回:1, 3, 4, 4, 5, 3, 6

然后使用DISTINCT将返回1, 3, 4, 5, 6

您在SUM之外使用了DISTINCT,因此,所有数字(包括双精度数)都会相加,然后您将获得结果的DISTINCT值,该值已经是一个数字。换句话说,DISTINCT在您的查询中不执行任何操作。

现在,如果你这样做:SELECT SUM(DISTINCT pp.EffectivePrice),那么你会将所有不同的价格加起来。

但实际上,这可能也不对。你确定你不想要总数的总和吗?我认为你根本不应该使用DISTINCT。