Простите, если это простой вопрос. Тем не менее, я искал ответ повсюду в течение часа.
У меня есть db_table, с которой мне нужно отсортировать вывод в таблицу на веб-странице. Данные хранятся в db_table следующим образом:
date Area Value
------ ------ -------
11-mar-18 middle 10
11-mar-18 bottom 5
11-mar-18 top 12
12-mar-18 top 14
12-mar-18 bottom 4
12-mar-18 middle 17
Возникает вопрос: как их отсортировать, чтобы получить следующий результат:
date Area Value
------ ------ -------
11-mar-18 top 12
11-mar-18 middle 10
11-mar-18 bottom 5
12-mar-18 top 14
12-mar-18 middle 17
12-mar-18 bottom 4
Любая помощь приветствуется.


Сортировка области по убыванию в алфавитном порядке как второй компонент Сортировать по:
select *
from db_table
order by "date", area desc;
Как вы упомянули, если у области есть значения A, B, C, D, и они хотели, чтобы они были отсортированы в порядке C, B, D, A, используйте:
select *
from db_table
order by "date", decode(area,'C',1,'B',2,'D',3,'A',4);
P.S. в частности, я помещаю столбец даты в кавычки, поскольку уже создана таблица со столбцом "date", вместо date, что невозможно как ключевое слово.
упорядочить по "дате", декодировать (область, 'C', 1, 'B', 2, 'D', 3, 'A', 4)
Лучше всего использовать decode (или case) во всех ситуациях, и не использовать случайность, когда TOP, MIDDLE и BOTTOM оказываются в обратном лексикографическом порядке. Однажды они изменятся на ПЕРВЫЙ, СРЕДНИЙ, ПОСЛЕДНИЙ, и запрос больше не будет давать правильный порядок. Лучше всего заставить их внести необходимые изменения в ORDER BY, если они когда-нибудь сделают что-то подобное.
select *
from db_table
order by "date",
case
when area = 'top' then 1
when area = 'middle' then 2
when area = 'bottom' then 3
else 4
end;
Обратитесь к Пользовательский порядок сортировки
«Простое» выражение регистра работает еще лучше: case area when 'top' then 1 when 'middle' then 2 when 'bottom' then 3 end Также обратите внимание, что если вы не укажете else 4, по умолчанию будет else null - с тем же эффектом при упорядочивании. Вам действительно не нужна деталь else.
@mathguy, без else 4, области с нулевым значением или значениями, отличными от верхнего, среднего или нижнего, будут отображаться первыми. Может быть, это нормально. else 4 помещает их в конец каждой группы. OP должен принять это решение.
Нет. Без else 4 выражение case будет возвращать null для строк, отличных от верхней, средней или нижней, и null появляется последним (по умолчанию - если не запрашивается явным образом, чтобы появиться первым) в order by. Вы, кажется, не знакомы с этим, так что это поможет вам написать очень небольшой пример для себя и запустить его. Вы поймете, что я имею в виду.
@mathguy, ты прав. Я тестировал mysql, а не oracle.
Чем отличается MySQL? Значение по умолчанию «else null» для case и значение по умолчанию «nulls last» для упорядочивания находятся в стандарте SQL.
instr() обеспечивает более короткое решение, чем case, в большинстве случаев:
select t.*
from t
order by t.date, instr('top,middle,bottom', area)
Ух ... Что, если значениями, которые нужно отсортировать в этом порядке, будут stop, top и op? Ни один серьезный программист никогда не должен прибегать к подобным уловкам. Используйте decode, если вы находите case слишком многословным.
@mathguy. . . Значения фиксированы. В большинстве случаев это вполне разумное решение.
@GordonLinoff, спасибо, это помогает мне при сортировке размеров, я использовал INSTR ('XS, S, M, L, XL, XXL', size_cd, 1), и он работает. Этот трюк мне очень пригодился.
Извините, я забыл упомянуть один аспект. Что, если бы варианты в столбце области были, например, A, B, C, D, и я хотел бы отсортировать по дате, а затем отсортировать области как C, B, D, A?