то есть:
| id | num |
| a | 1 |
| b | 2 |
| c | 3 |
| d | 4 |
| e | 5 |
и этот запрос, по сути, я пытаюсь сделать:
select num as number, sum(case num > number then num else 0 end) as summation from table;
(Я пытаюсь суммировать все числа, большие, чем текущее число в столбце num.)
Пример вывода из таблицы выше:
| num | summation |
| 1 | 14 |
| 2 | 12 |
| 3 | 9 |
| 4 | 5 |
|5 | 0 |
Проблема заключается в том, что я не могу использовать псевдоним, определенный в одном и том же предложении select; есть ли другой способ?
Спасибо!
Если вы используете MySQL 8.0, вы можете использовать функции окна.
SELECT num,
sum(num) OVER (ORDER BY num DESC) - num summation
FROM elbat
ORDER BY num;
До MySQL 8.0 вы можете использовать коррелированный подзапрос.
SELECT t1.num,
coalesce((SELECT sum(t2.num)
FROM elbat t2
WHERE t2.num > t1.num),
0) summation
FROM elbat t1
ORDER BY t1.num;
Вы можете написать это, используя коррелированный подзапрос:
select num,
(select sum(num)
from t 2
where t2.num >= t.num
) - num as summation
from t;
Вы можете использовать коррелированный подзапрос:
select num,
(select sum(num)
from table t2
where t2.num > t.num
) as summation
from table t1;
это работает, хотя немного грязно:
select num, (select sum(case when table.num > temp.num then num else 0 end)
from (select * from table) as temp
) as summation
from table;