2015-07-02 4 views
2

Так вот таблица:Как я могу получить общую сумму с последовательным индикатором?

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 

Спасибо!

ответ

0

Попробуйте, это работает в 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; 
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); 
+0

Извините, что если я использую sybase iq, но не MySQL? благодаря – gsql

Смежные вопросы