в общем, используйте вариант для сравнения входящего значения с другим столбцом (MYSQL)

0

то есть:

| 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; есть ли другой способ?
Спасибо!

Теги:

4 ответа

1
Лучший ответ

Если вы используете 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;
1

Вы можете написать это, используя коррелированный подзапрос:

select num,
       (select sum(num)
        from t 2
        where t2.num >= t.num
       ) - num as summation
from t;
1

Вы можете использовать коррелированный подзапрос:

select num,
       (select sum(num)
        from table t2
        where t2.num > t.num
       ) as summation 
from table t1;
0

это работает, хотя немного грязно:

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;
  • 0
    Скобки в вашем запросе не сбалансированы.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню