【问题标题】:MySQL: How to sum on joined queries (subqueries) with multiple conditions?MySQL:如何对具有多个条件的连接查询(子查询)求和?
【发布时间】:2021-01-05 10:34:09
【问题描述】:

我有两张桌子:

表 Y:指示货币在什么时间段内有效

+-----------+---------+------+
| starttime | endtime | name |
+-----------+---------+------+
| 1         | 2       | Mark |
| 3.4       | 3.6     | Fred |
| 2         | 2.2     | Fred |
+-----------+---------+------+

表 Z

+-----------+---------+------+-------+
| starttime | endtime | name | money |
+-----------+---------+------+-------+
| 1.5       | 1.7     | Mark | 0.1   |
| 1.4       | 3.5     | Fred | 0.2   |
| 0.9       | 1.0     | Fred | 0.3   |
| 1.2       | 2.5     | Fred | 0.5   |
+-----------+---------+------+-------+

我想要什么:

+------+---------------+
| name | sum_validmoney|
+------+---------------+
| Mark | 0.1           |
| Fred | 0.7           | **=> this is 0.2+0.5 (because those rows overlapped in start/endtime segments)**
+------+---------------+

我希望根据表 Y 中指示的时间段约束(有界)总结表 Z 中的行。 也就是说,要在表 Z 中求和的行必须具有在表 Y 中找到的时间段 (对于其他查询,表 Z 上还有其他过滤器;但我认为这与此处无关)

我对 MySQL 很陌生。我已经尝试过子查询,但认为我缺少一些关键;我不确定这是否可以在没有一些复杂的循环结构的情况下完成,而 mysql 似乎没有很好的装备。

【问题讨论】:

    标签: mysql sql datetime subquery mysql-workbench


    【解决方案1】:

    您似乎想要过滤表z 上的范围重叠范围至少在表y 中一个范围的行。

    如果是这样,一种方法是:

    select name, sum(money) sum_valid_money
    from z
    where exists (
        select 1
        from y 
        where y.name = x.name and y.starttime <= x.endtime and y.endtime >= x.starttime
    )
    group by name
    

    【讨论】:

      猜你喜欢
      • 2012-05-12
      • 2011-03-12
      • 1970-01-01
      • 1970-01-01
      • 2015-04-08
      • 1970-01-01
      • 1970-01-01
      • 2017-07-10
      • 1970-01-01
      相关资源
      最近更新 更多