Таблица заказов по общему количеству, но не теряйте заказ по именам

#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 человека имеют одинаковое общее количество, следовательно, их ранг одинаков, и в результате они смешиваются при печати. Есть ли способ преодолеть это?