【问题标题】:Sum of Counts from successive dates连续日期的计数总和
【发布时间】:2015-10-07 09:22:31
【问题描述】:

我需要获取每个月的商品总数。

到目前为止,使用以下代码:

Select Count(mpay_collector_company.id) As `Number of Collector Companies`,
  Month(mpay_collector_company.created_at) As Month,
  Year(mpay_collector_company.created_at) As Year
From mpay_collector_company
Group By Month(mpay_collector_company.created_at),
  Year(mpay_collector_company.created_at)

我有以下回应:

#|Year|Month
------------
5|2014|11
3|2014|12
3|2015|1
7|2015|2
6|2015|3
2|2015|4
5|2015|6
1|2015|7

而不是每个月的数字,我想从每个月开始的总和,这将是这样的:

Sum|Year|Month
--------------
  5|2014|11
  8|2014|12
 11|2015|1
 18|2015|2
 24|2015|3
 26|2015|4
 31|2015|6
 32|2015|7

有什么想法吗?

编辑:这个请求将被实现为一个视图,所以子请求几乎是不可行的:x

【问题讨论】:

    标签: mysql date count sum


    【解决方案1】:

    您可以先选择不同的 year.months,然后检查每个值的计数

    select year,month , 
        ( SELECT count(*) FROM mpay_collector_company WHERE 
            Year(mpay_collector_company.created_at) <= temp1.year 
            AND 
            Month(mpay_collector_company.created_at) <= temp1.month 
        )
    from (
    Select DISTINCT 
        Month(mpay_collector_company.created_at) As month,
        Year(mpay_collector_company.created_at) As year
    From mpay_collector_company 
    ) as temp1
    ORDER BY year,month
    

    如果你想为每一年“重置”,只需将年份之间的比较更改为 EQUAL 就可以了

    select year,month , 
        ( SELECT count(*) FROM mpay_collector_company WHERE 
            Year(mpay_collector_company.created_at) = temp1.year 
            AND 
            Month(mpay_collector_company.created_at) <= temp1.month 
        )
    from (
    Select DISTINCT 
        Month(mpay_collector_company.created_at) As month,
        Year(mpay_collector_company.created_at) As year
    From mpay_collector_company 
    ) as temp1
    ORDER BY year,month
    

    【讨论】:

    • 这是一个很好的开始,谢谢!但是,对 2014 年的结果求和,然后为 2015 年重置,这意味着我得到 (2014)5->8->(2015)3->10->16... 而不是 (2014)5->8- >(2015)11->18->24...
    • 我已经为你更新了我的答案,用“reset”查询
    【解决方案2】:

    使用相关子查询来计算当前日期之前的行数也应该有效:

    Select 
      Count(id) As "Number of Collector Companies",
      Month(created_at) As Month,
      Year(created_at) As Year,
      (
        Select Count(*) 
        From mpay_collector_company 
        Where EXTRACT(YEAR_MONTH from created_at) <= EXTRACT(YEAR_MONTH from m.created_at)     
      ) as running_count
    From mpay_collector_company m
    Group By Year(created_at), Month(created_at);
    

    Sample SQL Fiddle 正在展示它

    【讨论】:

      【解决方案3】:

      这样的事情可能会起作用:

      Select Count(distinct previous_mpay_collector_company.id)+ Count(distinct mpay_collector_company.id) As `Number of Collector Companies`,
             Month(mpay_collector_company.created_at) As Month,
             Year(mpay_collector_company.created_at) As Year
      From mpay_collector_company
        Left Join mpay_collector_company previous_mpay_collector_company
          On   Year(mpay_collector_company.created_at) > Year(previous_mpay_collector_company.created_at)
       OR (Month(mpay_collector_company.created_at) > Month(previous_mpay_collector_company.created_at)
               And  Year(mpay_collector_company.created_at) >= Year(previous_mpay_collector_company.created_at))
        And previous_mpay_collector_company.id <> mpay_collector_company.id
      Group By Month(mpay_collector_company.created_at),
      Year(mpay_collector_company.created_at);
      

      诀窍是自加入前几个月的所有数据并从加入的表中计数。

      【讨论】:

      • 我得到了相当愚蠢的计数结果,但是我喜欢这个解决方案,因为我需要将它作为一个视图来实现,所以子请求并不是一件好事:p
      • 好吧,等一下,我会创建一些测试数据。
      • 那个查询有点失控,但我在插入一些测试数据后编辑了我的答案。
      • 顺便说一句,如果您担心性能,那么加入函数是不行的,因为 MySQL 将无法使用索引。
      • 感谢您的宝贵时间,我会在星期一回复您。工作上什么都有了,刚刚回到家度过了一个轻松的周末^^'
      【解决方案4】:
          Select 
      (Select Sum(Count(Z.id)) FROM mpay_collector_company z 
      where  z.created_at <= A.created_at) as '#', 
        Month(A.created_at) As Month,
        Year(A.created_at) As Year
      From mpay_collector_company A
      Group By Month(mpay_collector_company.created_at),
        Year(mpay_collector_company.created_at)
      

      这应该是为你做的,

      【讨论】:

        猜你喜欢
        • 2020-05-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-11
        • 2021-12-29
        • 1970-01-01
        相关资源
        最近更新 更多