Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2004.09.19;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.035 c
1-1094397791
Забывший
2004-09-05 19:23
2004.09.19
Как по OnMouseDown чего-либо (панели, к примеру) инциировать...


4-1091624090
А. Н. Оним
2004-08-04 16:54
2004.09.19
WMI &amp; Network Adapter


14-1094130139
вразлет
2004-09-02 17:02
2004.09.19
Одессе 210 лет


4-1091704068
Santana
2004-08-05 15:07
2004.09.19
Определить дескриптор Grid-a


14-1094109248
Rouse_
2004-09-02 11:14
2004.09.19
Вот это блин охрана :))))))))))





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский