【问题标题】:How can i get the total amount with consecutive indicator?如何使用连续指标获得总金额?
【发布时间】:2015-09-19 20:27:24
【问题描述】:

所以这是表格:

Name    Indicator   Amount
Anson       1         3.5
Anson       2         2.6
Anson       4         8.4
Anson       5         3.2
Ben         1         7
Ben         3         4.7
Ben         4         3.6

如果指标是连续的,如何获取总金额? 这是我想要的结果:

Name    Indicator   Amount
Anson       1,2       6.1
Anson       4,5       11.6
Ben         1         7
Ben         3,4       8.3

谢谢!

【问题讨论】:

    标签: sql sybase sap-iq


    【解决方案1】:

    不幸的是,MySQL 没有窗口函数。但是,如果您有一个递增 1 的值序列,那么该序列与 Indicator 之间的差异对于每个组都是恒定的。您可以使用变量创建这样的序列。

    剩下的只是算术和聚合:

    select name, group_concat(indicator), sum(amount)
    from (select t.*, (@rn := @rn + 1) as rn
          from table t cross join
               (select @rn := 0) params
          order by name, indicator
         ) t
    group by name, (rn - indicator)
    order by name, min(indicator);
    

    【讨论】:

    • 抱歉,如果我使用的是 sybase iq 而不是 MySQL,该怎么办?谢谢
    【解决方案2】:

    试试这个,它适用于 Oracle,所以我认为它应该适用于 mysql。不漂亮... 使用 Lag 函数带上前一个名称的指标和数量。然后找出指标之间的差异并将金额相加。最后使用 CASE 语句对返回的结果进行格式化。

    select name, 
    CASE diff WHEN 1 THEN to_char(prev_ind||','||indicator)
                                     ELSE to_char(indicator) END as Indicator,
    CASE diff WHEN 1 then to_char(sum_amount) 
                 else to_char(amounnt)   END as Amount
    FROM (     
    select name, indicator, prev_ind, sum(indicator-prev_ind) as diff, amounnt,
    sum(amounnt + prev_amount) sum_amount
    from (
    
    select name, indicator, lag(indicator,1,0) over (order by name) prev_ind, amounnt,
    lag(amounnt,1,0) over (order by name) prev_amount
    from tmp1
    order by name, indicator
    
    )
    group by  name, indicator, prev_ind, amounnt
    order by name, indicator)
    where diff != 2
    order by name;
    

    【讨论】:

      猜你喜欢
      • 2021-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多