【问题标题】:SQL: Having MAX <> SUMSQL:有 MAX <> SUM
【发布时间】:2021-09-08 08:34:23
【问题描述】:

这实际上是一个非常简单的查询,但我不知道为什么它显示的值实际上被 HAVING 排除在外。


表 1 -> 维护表

  • ExpenditureComplete -> 浮动
  • 身份证

表 2 -> 子表(Maintable 多于 1 个条目)

  • 持续时间小时
  • MainTable_ID(链接到 Table1 的 ID)
  • 身份证
SELECT  
            a.ID, 
            b.MainTable_ID,
            MAX(a.ExpenditureComplete) as ExpenditureHours, 
            SUM(b.DurationHour) as DurationHours

    FROM [Table_1] as a
            Inner join
                [Table_2] as b
                    On
                        a.ID = b.MainTable_ID 

    Where a.Inactive = 0 
          and b.Inactive = 0

    Group by
                a.ID, 
                b.MainTable_ID

    Having MAX(a.ExpenditureComplete) <> SUM(b.DurationHour)

【问题讨论】:

  • 你的数据库是什么?
  • 运行此查询后的结果是什么?根据你的截图。它必须是 0 行。
  • 请不要发布带有样本数据的图片。将其以文本形式发布,或者更好的是,以脚本形式发布
  • 小心浮动。浮点算术是一门黑暗的艺术,主要是魔法,因此它会导致奇怪的结果。尝试将数据转换为定点值,然后再对它进行任何其他操作(DECIMAL、NUMERIC,无论您在 DBMS 中拥有什么)。
  • 尝试使用round(max(),2)round(sum(),2)

标签: sql sum max having having-clause


【解决方案1】:

试试这个:

Having ROUND(MAX(a.ExpenditureComplete),2) <> ROUND(SUM(b.DurationHour),2)

【讨论】:

    【解决方案2】:

    小数和 SUM 等的使用往往会令人讨厌。

    这应该是可能的(虽然我目前无法测试):

    WITH Aggregated AS (SELECT  
            a.ID, 
            b.MainTable_ID,
            MAX(a.ExpenditureComplete) as ExpenditureHours, 
            SUM(b.DurationHour) as DurationHours
    
    FROM [Table_1] as a
            Inner join
                [Table_2] as b
                    On
                        a.ID = b.MainTable_ID 
    
    Where a.Inactive = 0 
          and b.Inactive = 0
    
    Group by
                a.ID, 
                b.MainTable_ID)
    
    SELECT ID, Maintable_ID, ExpenditureHours, DurationHours
    FROM Aggregated
    WHERE ExpenditureHours <> DurationHours
    

    【讨论】:

      【解决方案3】:

      您正在将至少一个 FLOAT 值的结果与一个定点值或另一个 FLOAT 进行比较。

      浮点算术是一种黑暗的艺术,主要是魔法,它有自己的局限性和问题,最明显的是舍入错误。

      根据底层数据,您可能会看到相似的值,但在背景中它们略有不同。

      当您对数值进行关键任务比较时,请使用定点数据类型。

      正如https://docs.microsoft.com/en-us/previous-versions/sql/sql-server-2008-r2/ms187912(v=sql.105)?redirectedfrom=MSDN 和问题SQL Server rounding Error, Giving different values 中所述

      避免在 WHERE 子句搜索条件中使用浮点数或实数列,尤其是 = 和 运算符。最好将浮点数和实数列限制为 > 或

      在某些情况下,四舍五入可能会有所帮助,但将来会给您带来令人讨厌的惊喜。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-01-05
        • 2021-12-19
        • 2018-07-16
        • 2023-03-11
        • 2014-05-06
        • 2020-09-29
        • 1970-01-01
        相关资源
        最近更新 更多