Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.09.19;
Скачать: CL | DM;

Вниз

SQL-запрос   Найти похожие ветки 

 
Dionnis   (2004-08-21 21:39) [0]

Добрый вечер всем! У меня такой вопрос:
Чрез ADO выполняется следующий запрос (провайдер Microsoft OLE DB
Provider for Visual FoxPro) к dbf файлу:

SELECT POL, VID, RIGHT(DATR, 4) AS DR, COUNT(*) AS KOLVO FROM DELO
WHERE (DATR >= {01.01.1904}) AND (VID IN (1,2,3)) AND (SPOS <> 6) AND (SPOS2 <> 6)
AND (POL <> NULL) AND (DATR <> NULL) GROUP BY POL, VID, RIGHT(DATR, 4)
ORDER BY RIGHT(DATR, 4) DESC;

При его выполнении происходит ошибка:
SQL: GROUP BY clause is missing or invalid

Если выполнить импорт dbf файла в формат Accsess, то запрос замечательно работает.
В чём загвоздка? Или может синтаксис запроса драйвер для FoxPro не поддерживает?
Кто знает подскажите пожалуйста!


 
Наталия ©   (2004-08-22 12:28) [1]

Я не слишком уверена, но разве в Localsql есть такая функция - RIGHT? Ты help смотрел?


 
Anatoly Podgoretsky ©   (2004-08-22 13:34) [2]

АДО к Localsql отношения не имеет. А смотреть надо возможности провайдера, какой синтаксис он поддерживает, вероятно ему не нравится групировка по функции.


 
Dionnis   (2004-08-22 15:18) [3]

В документации по провайдеру приведён пример:

SELECT last_name,LEFT(notes,100) AS notes2 from employee GROUP BY last_name, notes2;

Но если написать мой запрос аналогично, т.е:
SELECT POL, VID, RIGHT(DATR, 4) AS DR, COUNT(*) AS KOLVO FROM DELO
WHERE (DATR >= {01.01.1904}) AND (VID IN (1,2,3)) AND (SPOS <> 6) AND (SPOS2 <> 6)
AND (POL <> NULL) AND (DATR <> NULL) GROUP BY POL, VID, DR
ORDER BY DR DESC;

Тогда возникает другая ошибка:
"Function argument value, type or count is invalid"

Вместо функции RIGHT(DATR, 4) пробовал писать EXTRACT(YEAR FROM DATR), т.е. запрос
выглядит следующим образом:

SELECT POL, VID, EXTRACT(YEAR FROM DATR) AS DR, COUNT(*) AS KOLVO FROM DELO
WHERE (DATR >= {01.01.1904}) AND (VID IN (1,2,3)) AND (SPOS <> 6) AND (SPOS2 <> 6)
AND (POL <> NULL) AND (DATR <> NULL) GROUP BY POL, VID, DR
ORDER BY DR DESC;

в этом
случае возникает ошибка:
"Function name is missing )"


 
Flagman ©   (2004-08-22 15:52) [4]

Насколько я понимаю, DATR - поле типа Date...
А RIGHT - строковая функция...

Попробуй привести к DATR к строке.

Не в курсе, как эта функция называется в FoxPro, но что-то вроде такого должно получиться:

SELECT POL, VID, RIGHT(DATE_TO_STR(DATR), 4) AS DR, COUNT(*) AS KOLVO FROM DELO
WHERE (DATR >= {01.01.1904}) AND (VID IN (1,2,3)) AND (SPOS <> 6) AND (SPOS2 <> 6)
AND (POL <> NULL) AND (DATR <> NULL) GROUP BY POL, VID, DR
ORDER BY DR DESC;

"Function argument value, type or count is invalid" - это он ругается на несовпадение типов в аргументе функции - т.е. RIGHT не работает напрямую с Date.


 
Dionnis   (2004-08-22 17:13) [5]

Возможно вы правы, но только возникает другая ошибка:
"File "date_to_str.prg" does not exist", то есть не находит такой функции.


 
Flagman ©   (2004-08-22 17:17) [6]

>Не в курсе, как эта функция называется в FoxPro

>А смотреть надо возможности провайдера, какой синтаксис он поддерживает

Посмотри, какая функция в FoxPro используется для преобразования в строку. Я ж говорю, что-то вроде, но за точность названия функции не ручаюсь.


 
Dionnis   (2004-08-22 20:57) [7]

> Посмотри, какая функция в FoxPro используется для преобразования
> в строку. Я ж говорю, что-то вроде, но за точность названия
> функции не ручаюсь.

Спасибо большое за подсказки, вроде нашёл то что нужно это функция Year(Date):

SELECT POL, VID, YEAR(DATR) AS DR, COUNT(*) AS KOLVO FROM DELO WHERE (DATR >= %s) AND (VID IN (1,2,3)) AND (SPOS <> 6) AND (SPOS2 <> 6) AND (POL <> NULL) AND (DATR <> NULL) GROUP BY POL, VID, DR ORDER BY DR DESC

Запрос выполняется и ошибок не возникает, но теперь мой Query (класса TADOQuery) возвращает RecordCount = 0; 8-((


 
Flagman ©   (2004-08-22 21:22) [8]

WHERE (DATR >= %s) Это что? Если %s - это параметр, то стоит проверить, что ты в него передаешь. Может в таблице и нет DATR >= %s...

Попробуй условия по одному поубирать, глядишь и найдешь, где собака порылась ;)

Кстати, при сравнении с NULL обычно ставится не "= NULL" и "<> NULL", а "is NULL" и "is not NULL", хотя это, конечно, вряд ли повлияет... IMHO, скорее всего %s неправильно воспринимается...


 
Dionnis ©   (2004-08-23 10:03) [9]


> WHERE (DATR >= %s) Это что? Если %s - это параметр, то стоит
> проверить, что ты в него передаешь. Может в таблице и нет
> DATR >= %s...


%s - это естественно параметр, просто забыл его на дату заменить.
А (<> NULL) и (IS NOT NULL) действительно не одно и то же!!!
Спасибо огромное за подсказки!!! Запрос теперь работает замечательно!



Страницы: 1 вся ветка

Текущий архив: 2004.09.19;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.028 c
3-1093159488
Project1
2004-08-22 11:24
2004.09.19
"Холостой" update...


1-1094278842
Соколов
2004-09-04 10:20
2004.09.19
TextFile


1-1094132658
Соколов
2004-09-02 17:44
2004.09.19
Chart


3-1093190448
Flagman
2004-08-22 20:00
2004.09.19
Где найти описания EXCEPTION для ORACLE?


1-1094351281
bigfoot
2004-09-05 06:28
2004.09.19
Дата в реестре