Функция MySQL SELECT для суммирования текущих данных - PullRequest
2 голосов
/ 28 марта 2011

У меня есть запрос, который возвращает что-то вроде этого:

| ID | Val |  
| 0  | 10  |     
| 1  | 20  |     
| 2  | 30  |  

Но вместо этого я хочу что-то вроде этого:

| ID | Val | Sum |   
| 0  | 10  |  10 |   
| 1  | 20  |  30 |   
| 2  | 30  |  60 |   

Это способ сделать это по запросу (я использую MySQL)?

Tks

Ответы [ 3 ]

7 голосов
/ 28 марта 2011

Это называется накопленной суммой.

В Oracle и PostgreSQL рассчитывается с помощью оконной функции:

SELECT  id, val, SUM() OVER (ORDER BY id ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
FROM    mytable

Однако MySQL не поддерживает его.

В MySQL вы можете рассчитать его, используя переменные сеанса:

SET @s = 0;

SELECT  id, val, @s := @s + val
FROM    mytable
ORDER BY
        id
;

или чисто на основе множеств, но менее эффективным способом:

SELECT  t1.id, t1.val, SUM(t2.val)
FROM    mytable t1
JOIN    mytable t2
ON      t2.id <= t1.id
GROUP BY
        t1.id
;
3 голосов
/ 28 марта 2011

Хотелось бы что-нибудь подобное для ваших целей? (Предупреждение, потенциально действительно чертовски медленно с подвыбором).

SELECT t1.id, t1.val, (SELECT SUM(val) FROM table AS t2 WHERE t2.id <= t1.id) 'sum'
   FROM table AS t1
   ORDER BY id ASC
0 голосов
/ 28 марта 2011

Предполагая, что имя таблицы равно t, вы можете использовать такой запрос:

select t.id, t.val, sum(t2.val) Sum
  from t, t t2
 where t2.id <= t.id
group by t.id, t.val

(проверено в Oracle)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...