Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сорировка таблицы 
V
    Опции темы
Garmahis
Дата 10.5.2006, 10:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 254
Регистрация: 23.12.2004

Репутация: нет
Всего: 4



Есть MS SQL Server 2000 и на нём таблица например Table. В таблице две колонки скажем A и B. В первой колонке идёт данные типа varchar и выглядят так - ЗБ № 10
надо её отобразить и отсортировать. Используем AdoQuery, Dataset и DBGridEh. SQL пишем SELECT * FROM Table ORDER BY A
и видим что таблица отсортирована в следующем порядке:
ЗБ № 1
ЗБ № 10
ЗБ № 11
ЗБ № 2
ЗБ № 3
...
Как заставить сортировать в нормальном порядке что бы после одного шло 2 и тд?

 
PM   Вверх
Grig
Дата 10.5.2006, 12:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 809
Регистрация: 29.4.2005
Где: Иркутск

Репутация: 4
Всего: 16



Надеюсь, ЗБ № - величина постоянная?
Тогда держи запросик:
Код

select a,convert(int,substring (a, 6, 2)) as b from test order by b


Добавлено @ 12:43 
вот даже так:
Код

select a,convert(int,substring (a, 6, ((len(a)-6)+1))) as b from test order by b


Добавлено @ 12:45 
Пояснение:
 ЗБ №  - вместе с пробелом на конце занимает 5 символов, то, что идет после этого я преобразовываю в int и сортирую по этому полю.
Удачи!  

Это сообщение отредактировал(а) Grig - 10.5.2006, 12:49


--------------------
        
PM MAIL ICQ   Вверх
Garmahis
Дата 10.5.2006, 17:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 254
Регистрация: 23.12.2004

Репутация: нет
Всего: 4



К сожалению может меняться.... И не только ЗБ но и сам номер может принять вид например 10(65) 
PM   Вверх
Grig
Дата 11.5.2006, 02:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 809
Регистрация: 29.4.2005
Где: Иркутск

Репутация: 4
Всего: 16



Garmahis, ну тогда потрудись выложить все возможные значения этого поля по принципу:
Количество слов в ячейке,
числовой формат.

Кстати, а если 10(65) то сортировать его как 10 или 65? 


--------------------
        
PM MAIL ICQ   Вверх
Grig
Дата 11.5.2006, 07:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 809
Регистрация: 29.4.2005
Где: Иркутск

Репутация: 4
Всего: 16



Немного модернизировал тот запросик.
Теперь всего лишь надо, чтобы последнее слово (разделитель пробел) являлось числом.
Вот смотри:
Код

select a,convert(int,REVERSE(SUBSTRING(REVERSE(ltrim(rtrim(a))),1,CHARINDEX(' ',REVERSE(ltrim(rtrim(a))))-1))) as b from test order by b
 


--------------------
        
PM MAIL ICQ   Вверх
Garmahis
Дата 11.5.2006, 08:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 254
Регистрация: 23.12.2004

Репутация: нет
Всего: 4



Большое спасибо!
Возможные значения текста до номера практически любой текст максимум из 2-3 слов. Номер может быть двух видов. просто число. и число и в скобках другое число. По какому сортировать тут всё равно. А можно сортировать от последнего пробела до "(" или до конца если скобки нет? 

Это сообщение отредактировал(а) Garmahis - 11.5.2006, 08:24
PM   Вверх
Grig
Дата 11.5.2006, 09:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 809
Регистрация: 29.4.2005
Где: Иркутск

Репутация: 4
Всего: 16



Как я понял таблица состоит из таких значений

А
ЗБ № 1    
ЗБ № 10 
dsf sdfs dsfsd fsd sdsd 222
ffgf  hgh gh 22(345)

Следующий запрос игнорирует число, которое в скобка (если такое вообще присутствует) и сортирует значения:
Код


select a,case CHARINDEX('(',a) when 0 then 
convert(int,REVERSE(SUBSTRING(REVERSE(ltrim(rtrim(a))),1,CHARINDEX(' ',REVERSE(ltrim(rtrim(a))))-1))) 
else
convert(int,REVERSE(SUBSTRING(REVERSE(ltrim(rtrim(a))),CHARINDEX('(',REVERSE(ltrim(rtrim(a))))+1, CHARINDEX(' ',REVERSE(ltrim(rtrim(a))))-1-CHARINDEX('(',REVERSE(ltrim(rtrim(a)))))))
end as b from test
order by b



Притом количество слов до числа значения не имеет.

Добавлено @ 09:59 
А вот этот запрос сортирует по тому, что находится в скобках, игнорируя то число, которое находится вне скобок:

Код

select a,case CHARINDEX('(',a) when 0 then 
convert(int,REVERSE(SUBSTRING(REVERSE(ltrim(rtrim(a))),1,CHARINDEX(' ',REVERSE(ltrim(rtrim(a))))-1))) 
else
convert(int,reverse(SUBSTRING(REVERSE(ltrim(rtrim(a))),2,CHARINDEX('(',REVERSE(ltrim(rtrim(a))))-2)))
end as b from test
order by b


Я протестировал, работает. 
Главное не шутковать с пробелами в записях, например за корректную сортировку такой вот записи:
Цитата

ЗБ №     10    (   23    )   

я лично не отвечаю.

Удачи!  

Это сообщение отредактировал(а) Grig - 11.5.2006, 10:00


--------------------
        
PM MAIL ICQ   Вверх
Grig
Дата 11.5.2006, 10:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 809
Регистрация: 29.4.2005
Где: Иркутск

Репутация: 4
Всего: 16



Ага, блин!!!!
Еще один баг обнаружился: если само слово содержит скобки, то для сортировки это может плохо кончится. Например:
ЗБ № (ПОКРЫШКА) черно-зеленая 348
вывалит тебе ошибку конвертации.
Надеюсь, у тебя таких записей нет?
  

Это сообщение отредактировал(а) Grig - 11.5.2006, 10:06


--------------------
        
PM MAIL ICQ   Вверх
Dynamic
Дата 11.5.2006, 11:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 372
Регистрация: 5.7.2004
Где: Салехард

Репутация: 2
Всего: 15



Цитата(Grig @  11.5.2006,  09:44 Найти цитируемый пост)
select a,case CHARINDEX('(',a) when 0 then 
convert(int,REVERSE(SUBSTRING(REVERSE(ltrim(rtrim(a))),1,CHARINDEX(' ',REVERSE(ltrim(rtrim(a))))-1))) 
else
convert(int,REVERSE(SUBSTRING(REVERSE(ltrim(rtrim(a))),CHARINDEX('(',REVERSE(ltrim(rtrim(a))))+1, CHARINDEX(' ',REVERSE(ltrim(rtrim(a))))-1-CHARINDEX('(',REVERSE(ltrim(rtrim(a)))))))
end as b from test
order by b

Ужасть, лучше уж тогда номер держать в другом поле, а на клиента выводить селектом со сцеплением:
Код

select num||' '||code from table.....
 такими запросами всех случаев не предусмотреть, а выхватывать ошибки при сортировке - это уж слишком!

имхо.
 


--------------------
Было бы о чем молчать, а уж что сказать – всегда найдется...
PM MAIL WWW   Вверх
Garmahis
Дата 11.5.2006, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 254
Регистрация: 23.12.2004

Репутация: нет
Всего: 4



Всем большое спасибо! 
PM   Вверх
Vit
Дата 11.5.2006, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: 14
Всего: 207



А не лучше ли таблицы сделать по человечески? Путём вынесения критерия для сортировки в отдельное поле? 


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
Garmahis
Дата 11.5.2006, 18:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 254
Регистрация: 23.12.2004

Репутация: нет
Всего: 4



Я так и сделал smile 
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.0737 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.