2011-10-31 85 views
-1

我们有一个'报告生成器',它基本上建立了一系列基于用户选择的选项的MySQL查询。来自一系列查询的数据被用来绘制图表。我们运行了一个基于SUM返回不正确值的报表。下面是该查询(我不知道是否有代码在这个网站格式化,所以我只是将其粘贴):MYSQL问题与DISTINCT 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()'的结果比它应该高。预先感谢您的帮助。

回答

1

SELECT DISTINCT只返回唯一的行。您的查询尽管涉及很高,但在使用SUM()版本时仅返回单个字段的单个行。

当您执行SELECT DISTINCT pp.EffectivePrice时,您将消除碰巧具有相同EffectivePrice值的任何行。

因此,考虑到一些假返回数据

$1.00 
    $2.00 
    $1.00 
    $3.00 

的DISTINCT将隐藏重复$ 1.00包装的结果,你的总和为$ 1 + $ 60 + $ 3 = $ 6,它是现在$ 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。

+0

奇怪地删除DISTINCT给了我完全相同的结果(太高)。另一方面,在SUM()中移动DISTINCT会给出比预期更小的值。我不明白。 – user1022643

+0

删除DISTINCT将为您提供与我所解释的相同的值。在SUM内移动DISTINCT可以为您提供不同值的总和。如果你这样做,它应该给你同样的结果,如果你只有DISTINCT,没有SUM,并且自己加上了这些值。 – GolezTrol