我们有一个'报告生成器',它基本上根据用户选择的选项构建一系列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()”的结果高于它应该的结果。提前感谢您的帮助。
答案 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。