#sql
#sql
Вопрос:
У меня есть таблица, состоящая из 3 столбцов (Человек, Год и количество), поэтому для каждого человека есть несколько строк с разными годами и количеством и последняя строка с общим количеством. Я хочу, чтобы таблица была упорядочена по имени, но также упорядочена по общему количеству.
Таким образом, строки должны быть упорядочены по сумме, но также сгруппированы по Человеку и упорядочены по годам. Когда я пытаюсь упорядочить по сумме, конечно, путаются и человек, и годы. Есть ли способ разобраться в этом?
Комментарии:
1. Неправильная модель данных, вы не храните разные типы данных (год и текст) в одном столбце. Вычисление суммы за несколько лет-это то, что можно сделать в SQL, когда вам это нужно, но вы не храните это в своей базе данных. Это также решает вашу проблему и многие проблемы, с которыми вы еще не сталкивались.
Ответ №1:
Вы также сохранили эти строки «всего»? Черт возьми! Зачем ты это сделал?
В любом случае: если вы
- вычислите ранг для строк,
year
столбец которых равен'total'
и - добавьте
case
выражение вorder by
предложение,
ты можешь получить то, что хочешь:
SQLgt; with sorter as 2 (select name, cnt, 3 rank() over (order by cnt) rnk 4 from test 5 where year = 'total' 6 ) 7 select t.* 8 from test t join sorter s on s.name = t.name 9 order by s.rnk, case when year = 'total' then '9' 10 else year 11 end; NAME YEAR CNT ---- ----- ---------- John 2018 3 John 2019 2 John total 5 Bob 2017 2 Bob 2019 4 Bob total 6 6 rows selected. SQLgt;
Комментарии:
1. Спасибо за ваш ответ, однако я имел в виду, что в итоговой таблице мне также нужно, чтобы они были отсортированы по сумме, например, в вашем примере первым будет Джон, так как его общая сумма меньше
2. Ага, вот что ты имел в виду … Ладно, думаю, я понял. Отредактировал ответ; взгляните, пожалуйста.
3. Поскольку вы сохранили годы в виде строк, 9 сортируется после всех этих 2017, 2018, 2021, … лет, поэтому общая строка становится последней для каждого имени.
4. О, я понимаю, спасибо
5. Могу я задать еще 1 вопрос, я сделал то, что вы сказали, но в случае, когда 2 человека имеют одинаковое общее количество, следовательно, их ранг одинаков, и в результате они смешиваются при печати. Есть ли способ преодолеть это?