【问题标题】:SQL SUM() function ignoring WHERE clause and CASE statementSQL SUM() 函数忽略 WHERE 子句和 CASE 语句
【发布时间】:2012-06-06 05:09:29
【问题描述】:
    SELECT      u.FirstName + ' ' + u.LastName as 'User',
            COUNT(*) as 'Number of Calls',
            CONVERT(varchar(4), SUM(CASE WHEN c.FromTime BETWEEN @FromDate AND @ToDate
                THEN DATEDIFF(mi, c.FromTime, c.ToTime) ELSE 0 END) / 60) + ':' + 
            CASE WHEN SUM(CASE WHEN c.FromTime BETWEEN @FromDate AND @ToDate
                THEN DATEDIFF(mi, c.FromTime, c.ToTime) ELSE 0 END) % 60 < 10 THEN '0' ELSE '' END +
            CONVERT(varchar(2), SUM(DATEDIFF(mi, c.FromTime, c.ToTime)) % 60) as 'Total Time Spent',
            CONVERT(varchar(4), AVG(DATEDIFF(mi, c.FromTime, c.ToTime)) / 60) + ':' +
            CASE WHEN AVG(DATEDIFF(mi, c.FromTime, c.ToTime)) % 60 < 10 THEN '0' ELSE '' END +
            CONVERT(varchar(2), AVG(DATEDIFF(mi, c.FromTime, c.ToTime)) % 60) as 'Average Call Time'
FROM        Calls c
JOIN        Users u ON u.UserID = c.TakenBy
WHERE       c.FromTime BETWEEN @FromDate AND @ToDate
GROUP BY    u.UserID, u.FirstName, u.LastName
ORDER BY    u.FirstName + ' ' + u.LastName

前面的 SQL 查询返回正确的“调用次数”,但无论调用次数如何,“总时间”和“平均时间”始终相同(这显然是错误的)。

我已阅读并尝试在 SUM 中使用 CASE WHEN __ Then value ELSE 0 来实现,但它仍然返回不正确的值。

我可以让这个查询返回正确结果的唯一方法是,如果我完全去除所有其他信息,例如

SELECT SUM(DATEDIFF(mi, FromTime, ToTime)) FROM Calls WHERE c.FromTime BETWEEN...

我怎样才能仍然使用我的 JOIN 和 GROUP BY 并获得聚合函数来给我想要的结果?

感谢您的所有帮助!

【问题讨论】:

  • 我认为您在选择列中尝试做的事情太多,您可以尝试将其分解为子查询吗?
  • 为了澄清这一点,首先使用您的目标值构建一个选择。在那里检查正确的结果。之后你对它们进行分组并对列进行求和/平均。
  • 我同意上述评论者的观点,即您需要简化示例代码以尝试查找问题。因此,如果您可以在没有额外 CASE 语句的情况下重新发布示例 SQL(无论如何都不需要)。
  • 如果您执行简单的select *(并注释group by),c 中的 same 行是否在结果集中显示为多行? - 是否是那些影响总数的行的重复,并且您正在寻求消除?
  • 感谢所有帮助!我发现这是其中一行的数据问题;此查询按预期工作。 (我能够将 CASE 从 SUM 函数中取出,因为 WHERE 确实有效)

标签: sql sum aggregate


【解决方案1】:

使用子查询可能会更好,例如在 SELECT 部分,添加类​​似 (SELECT SUM(...) FROM ... WHERE ...) AS total_sum 的内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-24
    • 2020-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多