Russian Qt Forum

Программирование => Общий => Тема начата: kirill от Май 13, 2009, 08:17



Название: Помогите написать sql-запрос
Отправлено: kirill от Май 13, 2009, 08:17
Есть данные
912   A
412   G
222   B
912   C
я их хочу отсортировать по буквам - получу
912   A
222   B
912   C
412   G
теперь я их хочу сгруппировать по номеру, то есть получить
912   A
912   C
222   B
412   G

то есть отсортировать по букве, потом смотришь номер и переносишь в начало все строки с таким номером потом следующий номер и тд

смысл в том, что мне надо вывести отсортированные данные, но при этом следить чтобы одинаковые номера шли подряд и ради этого можно пожертвовать сортировкой по буквам.

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


Название: Re: Помогите написать sql-запрос
Отправлено: spirit от Май 13, 2009, 08:34
так что-ли SELECT * FROM test ORDER BY id DESC;?


Название: Re: Помогите написать sql-запрос
Отправлено: kirill от Май 13, 2009, 08:36
так что-ли SELECT * FROM test ORDER BY id DESC;?

Увы, не так. Разве вы видите в выходных данных сортировку по id?
912   A
912   C
222   B
412   G


Название: Re: Помогите написать sql-запрос
Отправлено: kirill от Май 13, 2009, 08:38
Еще раз.
Сортировка по букве первична. А потом идут перестановки снизу вверх строк с одинаковыми id.


Название: Re: Помогите написать sql-запрос
Отправлено: crossly от Май 13, 2009, 09:00
select * from test order by 1,2


Название: Re: Помогите написать sql-запрос
Отправлено: spirit от Май 13, 2009, 09:01
тогда так SELECT * FROM (SELECT * FROM test ORDER BY name) ORDER BY id DESC;,
но по результату он от первого не отличается, возможно на больших объемах данных.


Название: Re: Помогите написать sql-запрос
Отправлено: -QT- от Май 13, 2009, 09:13
Цитировать
смысл в том, что мне надо вывести отсортированные данные, но при этом следить чтобы одинаковые номера шли подряд и ради этого можно пожертвовать сортировкой по буквам.

Данная сортировка не подпадает под математическую модель sql запроса. поэтому либо писать обработчик самому,
либо IMHO переработать исходную компоновку хранения информации для возможного получения выходного результата
с помощю sql.


Название: Re: Помогите написать sql-запрос
Отправлено: kirill от Май 13, 2009, 09:36
select * from test order by 1,2

если не ошибаюсь, ответом на этот запрос будет
222   B
412   G
912   A
912   C
Что опять же не совпадает с нужным результатом.


Название: Re: Помогите написать sql-запрос
Отправлено: kirill от Май 13, 2009, 09:39
тогда так SELECT * FROM (SELECT * FROM test ORDER BY name) ORDER BY id DESC;,
но по результату он от первого не отличается, возможно на больших объемах данных.
результат
912   A
912   C
412   G
222   B

!=

912   A
912   C
222   B
412   G


Название: Re: Помогите написать sql-запрос
Отправлено: spirit от Май 13, 2009, 09:40
да, не обратил внимание.


Название: Re: Помогите написать sql-запрос
Отправлено: kirill от Май 13, 2009, 09:40
Цитировать
смысл в том, что мне надо вывести отсортированные данные, но при этом следить чтобы одинаковые номера шли подряд и ради этого можно пожертвовать сортировкой по буквам.

Данная сортировка не подпадает под математическую модель sql запроса. поэтому либо писать обработчик самому,
либо IMHO переработать исходную компоновку хранения информации для возможного получения выходного результата
с помощю sql.

Переработать не получится по многим причинам. Что ж придется писать свой обработчик. Спасибо.


Название: Re: Помогите написать sql-запрос
Отправлено: lit-uriy от Май 13, 2009, 11:16
если посмотреть на результат, то сортировка по букве точно не первична.
А если действительно нужен хитрой алгоритм с перестановками, то только в рукопашную.


Название: Re: Помогите написать sql-запрос
Отправлено: kirill от Май 13, 2009, 11:31
если посмотреть на результат, то сортировка по букве точно не первична.
А если действительно нужен хитрой алгоритм с перестановками, то только в рукопашную.
она первична. Если бы все буквы имели разные номера, то они бы выстроились строго по порядку.
Однако есть важное поле, которое может быть а может и не быть. Это этот самый номер. И если он есть, то  буквы с одинаковым номером должны идти подряд.
Типа "по возможности отсортировано" по букве.
Вот такая вот хрень.
Начал лопатить врукопашную.


Название: Re: Помогите написать sql-запрос
Отправлено: Kolobok от Май 18, 2009, 22:53
Код
SQL
SELECT * FROM test ORDER BY 1 DESC, 2 ASC
 


Название: Re: Помогите написать sql-запрос
Отправлено: break от Июнь 28, 2009, 03:00
Может создать хранимую процедуру вывода, в которой сначала во временную таблицу заполнятся данные отсортированные по буквам, а потом вторым проходом пересортируются с учетом одинакового номера. При реализации второй проход может быть собственно выводом пользователю.


Название: Re: Помогите написать sql-запрос
Отправлено: Tonal от Июнь 29, 2009, 10:32
Firebird 2.x берёт такое:
Код
SQL
SELECT TB.CODE, TB.NAME
FROM TB
INNER JOIN (
 SELECT CODE, min(NAME) FROM TB GROUP BY CODE) GR ON GR.CODE = TB.CODE
ORDER BY GR.NAME, TB.NAME