我们有一个'报告生成器',它基本上基于用户选择的选项构建了一系列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()'的结果高于应有的值。谢谢你的帮助。
SELECT DISTINCT只返回唯一的行。您的查询,即使它是高度复杂的,当您使用SUM()版本时,只返回带有单个字段的单行。
当您执行SELECT DISTINCT pp.EffectivePrice
时,您将消除碰巧具有相同EffectivePrice值的所有行。
所以,给定一些假的
返回数据 $1.00
$2.00
$1.00
$3.00
DISTINCT将隐藏重复的$1.00结果,并且您的总和将是$1 + $2 + $3 = $6,现在比实际总数少$1
当您选择使用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