powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Встроенный запрос
13 сообщений из 13, страница 1 из 1
Встроенный запрос
    #38114710
12345sql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть база данных с таблицами скрин по ссылке
Нужно сформировать запрос. Вывести фамилию тех клиентов, у которых возраст меньше среднего возраста всех клиентов.
Я сделал в два запроса, как сделать с вложенным?
Мой пример с двумя запросами:
SELECT avg(YEAR(DATE())-YEAR(datar)) as Sr_age FROM sved INTO TABLE age
SELECT fam FROM sved,age WHERE (YEAR(DATE())-YEAR(datar))< Age.sr_age
...
Рейтинг: 0 / 0
Встроенный запрос
    #38114734
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Во-первых, возраст надо определять не просто по году, например, так: 13738743
Во-вторых, а почему именно вложенный подзапрос и зачем он, если "средний возраст" - это одно число? То есть сначала калькулируем средний возраст в переменную, а затем отбираем запросом нужные фамилии. Другое дело, если не хочется два раза гонять UDFдля определения возраста каждого клиента (первый раз - в расчете среднего, второй - при отборе), но, с другой стороны, у нас же не MSSQL, сделать несколько последовательных выборок-обработок никто не запрещает...
Код: sql
1.
2.
3.
4.
SELECT fam, vozrast(datar,DATE()) as age FROM sved INTO CURSOR ages
AVERAGE ages.age TO avg_age
SELECT fam FROM ages WHERE age<m.avg_age
USE IN ages
...
Рейтинг: 0 / 0
Встроенный запрос
    #38115064
sg12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndreTM

Этому человеку не нужно определять ВОЗРАСТ.
Вас смутило знакомое вам слово.
Ему нужно определить тех клиентов, у которых возраст МЕНЬШЕ среднего возраста всех клиентов, т.е. чья дата рождения НЕ МЕНЬШЕ определенной даты.
И он хочет это сделать одним запросом.

Примерно так (давно этим не занимался)
SELECT fam FROM sved WHERE YEAR(datar) > (SELECT AVG(YEAR(datar)) FROM sved)
И скорее всего, YEAR(datar) лучше заменить на VAL(DTOS(datar)), раз там список гостей.
...
Рейтинг: 0 / 0
Встроенный запрос
    #38115655
12345sql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ответ прост.
SELECT fam FROM sved WHERE (YEAR(DATE())-YEAR(datar)) < (select avg(YEAR(DATE())-YEAR(datar)) FROM sved)
...
Рейтинг: 0 / 0
Встроенный запрос
    #38115767
sg12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
12345sqlОтвет прост.
SELECT fam FROM sved WHERE (YEAR(DATE())-YEAR(datar)) < (select avg(YEAR(DATE())-YEAR(datar)) FROM sved)

Что у вас меняется, если в вашей функции убрать YEAR(DATE()) по разные стороны сравнения?

Сегодня 18 января, у кого-то может быть день рождения (хотя и необязательно).
Проверьте вашу функцию, например, при трех датах: 17 янв 2000, 18 янв 2000, 19 янв 2000.
Вам возраст нужен или число годов считая от года рождения?
...
Рейтинг: 0 / 0
Встроенный запрос
    #38116029
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sg12Примерно так (давно этим не занимался)
SELECT fam FROM sved WHERE YEAR(datar) > (SELECT AVG(YEAR(datar)) FROM sved)
И скорее всего, YEAR(datar) лучше заменить на VAL(DTOS(datar)), раз там список гостей.В принципе, логично. Вот только VAL(DTOS( - нелинейная, и среднее окажется несколько неверным... Тогда уж лучше посчитать возраст в днях и сравнить:
Код: sql
1.
SELECT fam FROM sved WHERE (DATE()-datar) < (SELECT AVG(DATE()-datar) FROM sved)
...
Рейтинг: 0 / 0
Встроенный запрос
    #38116063
sg12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndreTMSELECT fam FROM sved WHERE (DATE()-datar) < (SELECT AVG(DATE()-datar) FROM sved)


Да, так получше будет.
Если еще високосная дата не подкузьмит, но лень проверять.
...
Рейтинг: 0 / 0
Встроенный запрос
    #38116084
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sg12[Если еще високосная дата не подкузьмитФокс считает разницу дат по своему встроенному календарю, так что все високосные учитываются нормально:
Код: sql
1.
2.
? {^1905-01-18} - {^1895-01-18}
? 365+366+365*3+365+365*3+366

Кстати, если просто даты формировать можно в диапазоне от 1601 до 9999 года, то разность считается и с 0001 годом...
Код: sql
1.
?{^9999-12-31 23:59:59}-{^0001-01-01 00:00:00}
...
Рейтинг: 0 / 0
Встроенный запрос
    #38116102
sg12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndreTM, да, похоже функцию можно отправлять Людмиле в копилку.
...
Рейтинг: 0 / 0
Встроенный запрос
    #38119347
mosalova
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AndreTM,

А в Вашем примере:
Код: sql
1.
SELECT fam FROM sved WHERE (DATE()-datar) < (SELECT AVG(DATE()-datar) FROM sved)



AVG - это функция пользователя? в хэлпе я нашла команду AVERAGE
...
Рейтинг: 0 / 0
Встроенный запрос
    #38119378
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mosalova, нет, это стандартная агрегатная функция, используемая в select-sql.
...
Рейтинг: 0 / 0
Встроенный запрос
    #38119460
mosalova
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tanglir,
спасибо, теперь нашла
...
Рейтинг: 0 / 0
Встроенный запрос
    #38122577
Людмila
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sg12 да, похоже функцию можно отправлять Людмиле в копилку.

После её опубликования она (Функция) в копилке уже у половины Россиян и не только. Потому что Хорошая!
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Встроенный запрос
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]