【问题标题】:HAVING SUM issue有总和问题
【发布时间】:2015-11-28 23:49:35
【问题描述】:

我对 HAVING SUM 语句有疑问。

My table:

id int(11) AUTO_INCREMENT
date date
number int(3)

+----+------------+--------+
| id | date       | number |
+----+------------+--------+    
| 1  | 2010-01-02 |   0    |
| 2  | 2010-01-03 |   3    |
| 3  | 2010-01-04 |   0    |
| 4  | 2010-01-05 |   2    |
| 5  | 2010-01-06 |   1    |
| 6  | 2010-01-07 |   3    |
+----+------------+--------+

我想返回数字的SUM为6和date>'2010-01-04'的日期

我想返回添加字段号等于 6 的日期(在特定日期之后,在本例中为 2010-01-04)。示例:我的查询应该返回 2010-01-07,因为 2 在 2010-01-05 1 在 2010-01-06 3 在 2010-01-07

我已经测试了这个查询但没有成功:

SELECT date, SUM(number) AS total FROM MyTable 
GROUP BY date
HAVING SUM(number) = 6

【问题讨论】:

  • 即使更新了您的问题,仍然不清楚您想从哪里开始滚动总和。
  • 如果最后一行的数字是 4 怎么办?结果永远不会等于 6。那么,然后呢?

标签: mysql sum conditional-statements having


【解决方案1】:

看起来您几乎在原始问题中找到了正确的查询。我添加了一个WHERE 子句来限制仅比2010-01-04 更新的日期:

SELECT date, SUM(number) AS total
FROM MyTable
WHERE date > '2010-01-04'
GROUP BY date
HAVING SUM(number) = 6

【讨论】:

  • 根据您在OP中提供的样本数据,没有匹配的记录。请编辑您的问题并向我们展示MyTable 的表定义。如果您向我们展示一个将生成非空结果集的示例输入,也可能会很好。
  • 您需要一组记录共享特定日期,其数量 sum 等于 6。您提供给我们的数据样本每个日期只有一条记录,并且number 的值都小于 6。
  • 当时您的原始问题根本不清楚。您的要求与您的 OP 所暗示的完全不同。
【解决方案2】:
select date 
    from 
      (select date, @n:=@n+total total 
          from 
            (select date, sum(number) total 
                from MyTable 
              where date > '2010-01-04' 
              group by date 
              order by date 
            ) t 
           cross join 
            (select @n:=0) n 
      ) tt 
   where total = 6

【讨论】:

  • 谢谢,我已经测试了你的答案。两者都有效=)
  • Splash58,我使用了您的代码(但我通过选择 MAX(date) 更改选择日期)。您是否知道循环是否无法返回预期的日期(如果它不存在于数据库中),在这种情况下,我不希望返回 MAX(date) 并且没有结果这样我可以设置我的 PHP 脚本出现错误消息...谢谢 =)
  • 当你使用组函数 mysql 返回结果。我认为如果询问日期但 max(date),您将不会收到任何行
【解决方案3】:

认为自连接可能是最简单的方法,在日期等于或大于自身的情况下将表与自身连接起来。

SELECT t1.date
FROM sometable t1
INNER JOIN sometable t2
ON t1.date <= t2.date
WHERE date > '2010-01-04'
GROUP BY t1.date
HAVING SUM(number) = 6

【讨论】:

    猜你喜欢
    • 2021-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-16
    • 2016-01-23
    相关资源
    最近更新 更多