Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Еще раз о SQL


Автор: Cashey 14.11.2002, 07:26
Подскажите как отобрать записи из таблице по уникальным двум символам.
Особо обращаю внимание не записи в которых первый символ заданный (напр. А%), а все записи в которых первые символы уникальны. Нужно для TDecisionQuery.

Автор: Vit 14.11.2002, 08:46
Боюсь, что для большинства баз данных никак. Вообще-то такие вещи не являются стандартом в SQL, следовательно надо читать доку по твоей базе данных конкретно...

Автор: Cashey 14.11.2002, 16:14
База старая создана на Clippere, переведена в win-кодировку через FOX. Объясню всю задачу целиком (может все же кто и сможет помочь, а оно ведь и другим полезным может оказаться) итак в базе ведутся сведения о покупателях в ней нет поля "регион" и никто код региона, где обитает покупатель, в нее отдельно не заносил. Теперь руководству потребовалось получить график продаж по регионам. Единственный способ опредилить из когого региона покупатель это 2 первые цифры его ИНН (такое поле в таблице есть), но как построить такой график неясно. Функции RightStr в SQL нет, а построить график обычными командами Паскаля вроде бы нельзя(или все же можно?). [B]А теперь внимание вопрос: :D Как решить подобныю задачу???

Автор: МММ 14.11.2002, 17:01
Если я правильно понял , то пойдет обычная сортировка
допустим Приморский край 2500000000

select * from table where inn>=250000000 and inn<=259999999

длина инн в зависимости от физ или юр лица

второй способ считывай данные с поля инн, веделяй первые два знака , уже средствами дельфи, и все!!!

Автор: Vit 15.11.2002, 00:11
1) Сортировка как сказал МММ
2) Добавь поле и занеси данные - 1 раз пройдёшь по записям, а далее уже всё нормально

Второй способ лучше - будет работать быстрее и корректнее.

Автор: Cashey 15.11.2002, 03:28
Первый способ неприемлем, так как нужно количество всех одинаковых первых двух цифр ИНН (ну представте себе как вы по этой методике построите график). Второй способ, гораздо интереснее, но мне неясно как его реализовать.

Автор: Vit 15.11.2002, 03:49
Как реализовать?

1) Делаем кверю "Alter Table" или в дизайне изменяем таблицу, добавляем новое поле
2) C помощью другой программы проходим по всей таблице record-by-record и заполняешь это новое поле
3) Меняешь свою программу - там где дописываются записи в таблицу и/или изменяются добавляешь обработку нового поля
...

Иногда (для некоторых баз данных) попытка засунуть более длинное поле в короткое приводит к обрезанию без сигнала об ошибках - тогда вообще достаточно сделать узкое поле шириной 2 символа (или сколько там надо), одной обычной кверёй "Update" заполнить это поле и если база позволяет триггер - то поставить триггер - тогда код программы вообще не надо менять.


Автор: Cashey 15.11.2002, 04:06
Спосибо вит за теорию, но, пожалйста объясни мне, дураку, как "изъять" символы из записи в ячейке базы, а уж перенести их куда надо я и сам смогу.

Автор: Cashey 15.11.2002, 04:22
Знаете я решил проблему с помощью FOX PRO, там это делается просто:
select left(inn,2);
from TableName;
group by left(inn,2) into table

а для графиков еще проще : сразу

select left(inn,2), count(*);
from TableName;
group by left(inn,2)

Но это в фоксе, а как же мы дельфисты? Неужели ударим в грязь лицом?????

Автор: Vit 15.11.2002, 05:24
Так, давай по порядку. Что ты используешь для доступа - BDE+FOX pro driver? Так тогда попробуй эти квери и послать чуть-чуть видоизменив:

SQL
SELECT SUBSTRING(inn FROM 1 FOR 2)
from TableName



Автор: Vit 15.11.2002, 05:26
Если ты не менял пути установки програм по адресу:

С:\Program Files\Common Files\Borland Shared\BDE\LOCALSQL.HLP

Лежит файл справки по командам локального BDE. Там можно много интересного найти...

Автор: Vit 15.11.2002, 05:28
Цитата(Cashey @ 14.11.2002, 11:22)
Но это в фоксе, а как же мы дельфисты? Неужели ударим в грязь лицом?????

При чём здесь Дельфи? Ты же работаешь фактически только с BDE и всё что ты спрашиваешь вообще к Дельфи не имеет ни малейшего отношения - это только использование возможностей BDE драйвера, который ты используешь для доступа к базе данных.

Автор: Cashey 15.11.2002, 08:02
Для доступа использую только BDE, а FOX использовал только для занесения в новое поле необходимого фрагмента записи из другого. SUBSTRING не пробовал - моя вина. Пути при установке я менял, но где хелп знаю, но не знаю чего там интересного, кроме формата команд там ничего нет (да и форматы часто неполные что например стоит подсказка по функции format). Теперь о главном: используется действительно BDE, НО для работы с базами, в частности для построения DecisionCube используется SQL и вот тут уже начинает играть роль Delphi or FOX Pro т.к. диалекты языка запросов у них разные. Я до сих пор не знаю как в среде Delphi реализовать некоторые моменты при работе с БД, которые в фоксе делаются одной-двумя командами. Нет это я не для дискуссии о преимуществах одной из сред разработки, просто очень хотелось бы самое хорошее из фокса использовать и в дельфи. Кстати, может будут какие-нибудь рекомендации по совмещению если не исходных кодов, то хотя бы фрагментов программ написанных на этих двух языках?

Автор: Medved 15.11.2002, 08:13
Стандарными средствами локального SQL ты это не сделаешь, придется извращаться (как один из вариантов - через временные таблицы).

Если же ты используешь MS SQL (Transac-SQL) или Oracle (PL/SQL) то там это можно реализовать (как один из вариантов - в виде скрипта).

Автор: Vit 15.11.2002, 08:27
Так SUBSTRING помогло или нет?

Автор: Cashey 16.11.2002, 02:05
Цитата


Так SUBSTRING помогло или нет?


Нет, DecisionQuery  ее не поддерживает.

Автор: Vit 16.11.2002, 02:47
А обязательно использовать Descision Cube компоненты? Почему не обойтись обычным TChart/TDBChart + TQuery

Автор: Cashey 16.11.2002, 04:45
Decisison Cube более удобен при проектировании. Однако Вы правы, для анализа со сложными запросами наверное лучше использовать ту конструкцию. Хотя не понятно вроде бы они должны использовать один диалект SQL.

Автор: Vit 16.11.2002, 04:48
Цитата(Cashey @ 15.11.2002, 11:45)
Хотя не понятно вроде бы они должны использовать один диалект SQL.

Вроде бы да, но возможно стоят какие-то интерпретаторы или оптимизаторы перед посылкой SQL которые и не понимают расширенных возможностей... В общем странно всё это.

PS. Ко мне можно обращаться на "ты"


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)