:: Игры Разума
выборка одним селектом
mayil
Автор

Сообщений: 277
Откуда: Гянджа, Азербайд
Дата регистрации: 20.06.2006
Привет всем! Хотите задачу!?

Есть таблица, поле fio которого содержит вместе через один пробел и фамилию, и имя и отчество клиентов. Причем, заполняли его неряшливо – вот например так: ИВАнов пеТр СидоРович
Надо выудить из таблицы всех клиентов с именем Александр. Пусть искомое имя уже привоено переменной name:
name=”Александр”
Вопрос: как извлечь из таблицы в курсор всех Александров с помощью всего лишь одного селекта?


------------------
Ratings: 0 negative/0 positive
Re: выборка одним селектом
Владимир Максимов

Сообщений: 14095
Откуда: Москва
Дата регистрации: 02.09.2000
Если данные заполнялись действительно неряшливо, то, в общем случае - никак. Все равно будет часть данных потеряна или выбрано лишнее. Ну, там синтаксические ошибки, например.

Если же вопрос стоит только в регистре букв и имя - это всегда второе слово, то все довольно просто

SELECT * FROM MyTab WHERE UPPER(GetWordNum(MyField,2))==UPPER(”Александр”)
Ratings: 0 negative/0 positive
Re: выборка одним селектом
rhs72

Сообщений: 1934
Откуда: Алматы - Чарджоу
Дата регистрации: 21.03.2007
Я предлагаю другой вариант, с учетом того, что в одном поле содержится ФАМИЛИЯ-ИМЯ-ОТЧЕСТВО :
SELECT * FROM MyTab WHERE UPPER(SUBSTR(fio,LEN(fio)-ATCC(" ",fio),LEN(fio)-ATCC(" ",fio))=UPPER(name)

Возможно немного надо подправить указатели начальной и конечной позиции в функции SUBSTR()


------------------
"Знание того, что считать ответом, равносильно знанию ответа".
Ratings: 0 negative/0 positive
Re: выборка одним селектом
mayil
Автор

Сообщений: 277
Откуда: Гянджа, Азербайд
Дата регистрации: 20.06.2006
Привет всем!

Ваши решения хороши!

А вот мое решение:

name="Александр"

SELECT fio FROM myTable WHERE UPPER(ALLTRIM(SUBSTR(fio,AT(' ',fio,1)+1,AT(' ',fio,2)-AT(' ',fio,1))))==UPPER(name)

Однако этот селект работает правильно, если между словами только один пробел! А потому мне пришлось написать строку (одну!) UPDATE, убирающую лишние пробелы между словами!

Напишите вы тоже, опять наверное что-то хорошее получится!
Майкл


------------------
Ratings: 0 negative/0 positive
Re: выборка одним селектом
AleksM

Сообщений: 17881
Дата регистрации: 11.11.2003
Володя Максимов уже всё написал ;)
Но можно ещё так:

SELECT fio FROM myTable WHERE " "+UPPER(ALLTRIM(name))+" " $ fio


------------------
Лучше переесть, чем недоспать.
Не спеши, а то успеешь.
Ratings: 0 negative/0 positive
Re: выборка одним селектом
leonid

Сообщений: 3202
Откуда: Рига
Дата регистрации: 03.02.2006
AleksM
SELECT fio FROM myTable WHERE " "+UPPER(ALLTRIM(name))+" " $ fio
А где гарантия, что при этом name будет совпадать именно с именем, а не к примеру с отчеством?
Ratings: 0 negative/0 positive
Re: выборка одним селектом
AleksM

Сообщений: 17881
Дата регистрации: 11.11.2003
Гарантия в обрамляющих пробелах. Вот человек без отчества с именем "Александр" может быть, тогда не сработает.


------------------
Лучше переесть, чем недоспать.
Не спеши, а то успеешь.
Ratings: 0 negative/0 positive
Re: выборка одним селектом
leonid

Сообщений: 3202
Откуда: Рига
Дата регистрации: 03.02.2006
Ну это если поле varchar, а если например char(100), то у отчества тоже будут пробелы.
Ratings: 0 negative/0 positive
Re: выборка одним селектом
mayil
Автор

Сообщений: 277
Откуда: Гянджа, Азербайд
Дата регистрации: 20.06.2006
Привет всем!

Знаете, друзья, Максимов использовал функцию, о существовании которой я просто не знал: GetWordNum() - я пока вырастаю из старых версий фокса. Эта функция сразу же сняла все мои проблемы. Она дает возможность указать номер слова в стринге, а это уже сила!
А скажите кто-нибудь, есть где новая сборка прибамбасов по типу Пинигинской!
Второе, есть ли где библиотека API - функций с русским хеллпом!

Благодарствую!
майкл.
Ratings: 0 negative/0 positive
Re: выборка одним селектом
mayil
Автор

Сообщений: 277
Откуда: Гянджа, Азербайд
Дата регистрации: 20.06.2006
Привет всем!

На предприятии ведется учет аремени, потраченного на ремонт техники. Для удобства записи часы и минуты записываются как одно дробное число, например 76 часов 3 мин записываем как 76,03 .

Когда надо сложить несколько таких чисел , можно в цикле разбить каждое очередное такое число на целую и дробную часть и далее просто....

Однако, если просуммировать поле Vremya с такими числами с помощью селекта (select .... , sum(vremya) .....from ... into ...., то конечно же, получится совсем не то.
И все таки, может ли кто сделать это именно селектом?

Майил
Ratings: 0 negative/0 positive
Re: выборка одним селектом
ssa

Сообщений: 12999
Откуда: Москва
Дата регистрации: 23.03.2005
mayil
Привет всем!
Знаете, друзья, Максимов использовал функцию, о существовании которой я просто не знал: GetWordNum() - я пока вырастаю из старых версий фокса. Эта функция сразу же сняла все мои проблемы. Она дает возможность указать номер слова в стринге, а это уже сила!
Эта функция, правда под названием WordNum и в отдельной библиотеке, существует в стандартной поставке фокса еще с версии 2.0


------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/0 positive
Re: выборка одним селектом
ssa

Сообщений: 12999
Откуда: Москва
Дата регистрации: 23.03.2005
mayil
Привет всем!
На предприятии ведется учет аремени, потраченного на ремонт техники. Для удобства записи часы и минуты записываются как одно дробное число, например 76 часов 3 мин записываем как 76,03 .

Когда надо сложить несколько таких чисел , можно в цикле разбить каждое очередное такое число на целую и дробную часть и далее просто....

Однако, если просуммировать поле Vremya с такими числами с помощью селекта (select .... , sum(vremya) .....from ... into ...., то конечно же, получится совсем не то.
И все таки, может ли кто сделать это именно селектом?

Майил
Перевести доморощенные единицы измерения в секунды и обсуммируйтесь хоть до посинения. Сумму секунд перевести в доморощенную единцу измерения потом, надеюсь, сможете?


------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/0 positive
Re: выборка одним селектом
mayil
Автор

Сообщений: 277
Откуда: Гянджа, Азербайд
Дата регистрации: 20.06.2006
Сэр!
Работнички мои от "доморощенных" величин отказываться не хотят - они им, консерваторам, дороги! Пришлось по ихнему делать. И вот результат (упрощенный вариант):

CREATE TABLE rabota ( vremya n(8,2), oplata n(8,2))

INSERT INTO rabota ( vremya ,oplata ) VALUES (27.56 , 10024.34)
INSERT INTO rabota ( vremya ,oplata ) VALUES (5.43 , 567.21)
INSERT INTO rabota ( vremya ,oplata ) VALUES (13.31 , 456.37)
INSERT INTO rabota ( vremya ,oplata ) VALUES (44.06 , 611.08)

BROWSE

SELECT ;
INT(SUM(60*INT(vremya )+(vremya - int(vremya ))*100)/60);
+MOD(SUM(60*INT(vremya )+(vremya - int(vremya ))*100),60)/100 as Время,;
SUM(oplata) as Оплата FROM rabota

Переводить "доморощенное" число в секунды нет надобности. Все перевел в минуты, сложил и вернул обратно в "доморощенную" форму.
С уважением, Майил.
Ratings: 0 negative/0 positive
Re: выборка одним селектом
h.i.a.

Сообщений: 4002
Откуда: Мурманск/Спб/Мск
Дата регистрации: 18.11.2005
* Не надо мусорить на чужих компьютерах: CREATE TABLE rabota
CREATE cursor rabota ( vremya n(8,2), oplata n(8,2))
INSERT INTO rabota ( vremya ,oplata ) VALUES (27.56 , 10024.34)
INSERT INTO rabota ( vremya ,oplata ) VALUES (5.43 , 567.21)
INSERT INTO rabota ( vremya ,oplata ) VALUES (13.31 , 456.37)
INSERT INTO rabota ( vremya ,oplata ) VALUES (44.06 , 611.08)
*BROWSE
SELECT ;
SUM(INT(vremya))+sum((vremya-INT(vremya))*100)/60 as sum_vremya,;
SUM(oplata) as sum_oplat FROM rabota


------------------




Исправлено 1 раз(а). Последнее : h.i.a., 13.11.07 18:03
Ratings: 0 negative/0 positive
Re: выборка одним селектом
mayil
Автор

Сообщений: 277
Откуда: Гянджа, Азербайд
Дата регистрации: 20.06.2006
Сэр!

Ваш селект вычисляет только часы, а минут нетути!
В резудьтате деления на 60, получается остаток в минутах, которое надо "прилепить" к часам после запятой.
И вообще, есть ли какие-либо другие способы записи времени, дающие возможность складывать времена более просто?

Майкл
Ratings: 0 negative/0 positive
Re: выборка одним селектом
AleksM

Сообщений: 17881
Дата регистрации: 11.11.2003
Серега Сизив тебе уже посоветовал правильное решение, НО оно вам не подошло.
Раз доморощенные единицы измерения, то и ф-ции для работы с ними д.б. тоже доморощенными.


------------------
Лучше переесть, чем недоспать.
Не спеши, а то успеешь.
Ratings: 0 negative/0 positive
Re: выборка одним селектом
ssa

Сообщений: 12999
Откуда: Москва
Дата регистрации: 23.03.2005
mayil
Сэр!
Работнички мои от "доморощенных" величин отказываться не хотят - они им, консерваторам, дороги! Пришлось по ихнему делать. И вот результат (упрощенный вариант):

CREATE TABLE rabota ( vremya n(8,2), oplata n(8,2))

INSERT INTO rabota ( vremya ,oplata ) VALUES (27.56 , 10024.34)
INSERT INTO rabota ( vremya ,oplata ) VALUES (5.43 , 567.21)
INSERT INTO rabota ( vremya ,oplata ) VALUES (13.31 , 456.37)
INSERT INTO rabota ( vremya ,oplata ) VALUES (44.06 , 611.08)

BROWSE

SELECT ;
INT(SUM(60*INT(vremya )+(vremya - int(vremya ))*100)/60);
+MOD(SUM(60*INT(vremya )+(vremya - int(vremya ))*100),60)/100 as Время,;
SUM(oplata) as Оплата FROM rabota

Переводить "доморощенное" число в секунды нет надобности. Все перевел в минуты, сложил и вернул обратно в "доморощенную" форму.
С уважением, Майил.
Батенька, Вы, впрочем как и многи другие, путаете хранение информации с ее отображением. То, что "работнички" хотят видеть в доморощенных единицах совсем не означает, что их и надо хранить и обрабатывать тоже в таких же единицах. Как только Вы это поймете, так у Вас сразу множество проблем отпадет сами собой. До прихода понимания занимайтесь борьбой с ветряными мельницами.


------------------
Лень - это неосознанная мудрость.




Исправлено 1 раз(а). Последнее : ssa, 14.11.07 11:18
Ratings: 0 negative/0 positive
Re: выборка одним селектом
mayil
Автор

Сообщений: 277
Откуда: Гянджа, Азербайд
Дата регистрации: 20.06.2006
Стоп, ребята!

У небезизвестного вам Дато есть лозунг: "Если зайца долго шлепать, он начнет соображать."
Так что, благодарствуем за шлепки! Сделайте передышку, отдохните немного, а я начну сначала.

Итак, в цеху ремонтируется двигатель. Его разбирают несколько рабочих - у каждого свой тариф оплаты, соответствующий его разряду. Они возятся с этим движком несколько недель, а за неделю у каждого рабочего набегает 30-40 часов с минутами, и эти часы надо ввести в таблицу, а потом за месяц, точнее, за весь срок ремонта сложить...

Поле типа DateTime не примет часы, большие 24 ... И что же ...?

Ковыряюсь дальше..
С уважением, Майкл.
Ratings: 0 negative/0 positive
Re: выборка одним селектом
ssa

Сообщений: 12999
Откуда: Москва
Дата регистрации: 23.03.2005
mayil
Поле типа DateTime не примет часы, большие 24 ... И что же ...?
Храни в поле типа int в минутах. Для показа преобразовывай в доморощенные единицы. Все. Только для показа, и только уже готовые данные.

ps: на самом деле в поле типа datetime лежит в двоичном виде число секунд от какого-то момента времени (обычно от начала 20-го века), которое для показа преобразуется к нужному виду.


------------------
Лень - это неосознанная мудрость.




Исправлено 1 раз(а). Последнее : ssa, 14.11.07 20:32
Ratings: 0 negative/0 positive
Re: выборка одним селектом
mayil
Автор

Сообщений: 277
Откуда: Гянджа, Азербайд
Дата регистрации: 20.06.2006
[quote ssa][quote mayil] Поле типа DateTime не примет часы, большие 24 ... И что же ...?
[/quote]
Храни в поле типа int в минутах. Для показа преобразовывай в доморощенные единицы. Все. Только для показа, и только уже готовые данные.

Ну а преобразовывать в минуты поступающую информацию, например такую: 67 ч 45 мин , кто будет делать? Чтобы записать его с интеджер-поле. Все те же хлопоты.
Я думал даже ввести 2 поля: "часы" и "минуты", прикинул, - опять же не то!
Так что первое, что пришло в голову, сработало, правда, на примитивном уровне - "доморощенном" , но все-таки селекты работают! Да ну его - пусть так и остается.
И так дел невпроворот.
Спасибо.
Майкл
Ratings: 0 negative/0 positive


Эта тема закрыта.

On-line: 3 (Гостей: 3)

© 2000-2024 Fox Club 
Яндекс.Метрика