【问题标题】:MYSQL Issue With DISTINCT SUMDISTINCT SUM 的 MYSQL 问题
【发布时间】:2011-10-31 20:26:09
【问题描述】:

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

【问题讨论】:

    标签: php mysql sum distinct report


    【解决方案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。

    【讨论】:

      【解决方案2】:

      当您选择使用 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。

      【讨论】:

      • 奇怪地删除 DISTINCT 给了我完全相同的结果(太高了)。另一方面,在 SUM() 中移动 DISTINCT 给出的值比预期的要小得多。我不明白。
      • 删除 DISTINCT 将为您提供与我解释的相同的值。在 SUM 中移动 DISTINCT 可以得到不同值的总和。如果你这样做,它应该给你同样的结果,就好像你只有 DISTINCT,没有 SUM,并自己加了值。
      猜你喜欢
      • 2015-01-10
      • 1970-01-01
      • 2018-03-18
      • 2019-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-30
      相关资源
      最近更新 更多