Гость
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Встроенный запрос / 13 сообщений из 13, страница 1 из 1
18.01.2013, 01:08
    #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
18.01.2013, 02:07
    #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
18.01.2013, 11:55
    #38115064
sg12
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Встроенный запрос
AndreTM

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

Примерно так (давно этим не занимался)
SELECT fam FROM sved WHERE YEAR(datar) > (SELECT AVG(YEAR(datar)) FROM sved)
И скорее всего, YEAR(datar) лучше заменить на VAL(DTOS(datar)), раз там список гостей.
...
Рейтинг: 0 / 0
18.01.2013, 16:11
    #38115655
12345sql
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Встроенный запрос
Ответ прост.
SELECT fam FROM sved WHERE (YEAR(DATE())-YEAR(datar)) < (select avg(YEAR(DATE())-YEAR(datar)) FROM sved)
...
Рейтинг: 0 / 0
18.01.2013, 17:27
    #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
18.01.2013, 21:48
    #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
18.01.2013, 22:31
    #38116063
sg12
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Встроенный запрос
AndreTMSELECT fam FROM sved WHERE (DATE()-datar) < (SELECT AVG(DATE()-datar) FROM sved)


Да, так получше будет.
Если еще високосная дата не подкузьмит, но лень проверять.
...
Рейтинг: 0 / 0
18.01.2013, 23:10
    #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
18.01.2013, 23:33
    #38116102
sg12
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Встроенный запрос
AndreTM, да, похоже функцию можно отправлять Людмиле в копилку.
...
Рейтинг: 0 / 0
22.01.2013, 12:15
    #38119347
mosalova
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Встроенный запрос
AndreTM,

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



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

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


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