2013-07-26 1 views
2

Я пытаюсь построить запрос (QueryB) для его ссылки в моем MS Access. Я знаю, что я получил синтаксис исходного выражения, у меня очень похожий рабочий контроль с QueryA.Datediff & Group Не работает?

Я только изменил имена полей и запросов. Однако я продолжаю получать позорную ошибку #Name? с QueryB. Разница между QueryA и QueryB - это код SQL. QueryA имеет GROUP BY и SUM(), а QueryB имеет только DATEDIFF(). Я попытался добавить GROUP BY в QueryB, но продолжал получать [... execute query не включает указанное выражение как часть функции агрегата].

Запрос Б:

SELECT IIF(DATEDIFF("d",Date_X,Date_Y)>100), 
ROUND(IIF(DATEDIFF("d",Date_X,Date_Y)/30,2), 
DATEDIFF("d",Date_X,Date_Y) 
AS DATEDIFF_X_Y 
FROM LAB_DATES GROUP BY LAB_DATES.ID; 

Это в MS Access SQL.

ControlB источник ссылки QueryB в MS Access:

=DLookUp("[DATE_DIFF_X_Y]", 
     "[QueryB]", 
     "[LAB_DATES.ID] = " & [Forms]![Lab Results Form]![Textbox_DATE_ID]) 

Когда вынимая GROUP BY, этот запрос работает нормально, но я получаю ошибку #Name? в контроле. Все данные взяты из ODBC MySQL. Доступ - это интерфейс.

Редактировать: Я могу просто отказаться GROUP BY. Но я получу ошибку #Name?. Моя цель - показать разницу дат между Date_X и Date_Y.

+0

DATE - это зарезервированное слово в MS Access, это может быть вашей проблемой. – basdwarf

+0

Извините, я подставлял слова из своих реальных запросов. (DATE не используется.) Я отредактирую его в LabDate. – DBonkins

ответ

0

[... выполнить запрос не включает указанное выражение как часть агрегатной функции]

Это сообщение об ошибке уже указывает на то, что с помощью GROUP BY не работает с агрегатными функциями.

DATEDIFF() является общей функцией и не работает с GROUP BY.

Причина этого заключается в том, что GROUP BY уменьшает ваш dataresult и отображает только одну строку на другую запись столбца, который вы используете.

Какова ваша цель для этого запроса в любом случае? Я уверен, что есть другая проблема для этой проблемы. GROUP BY DATE.ID звучит так, будто вы делаете GROUP BY на первичный ключ, который не имеет никакого эффекта, потому что первичные ключи уникальны для каждого определения.

+0

'DATEDIFF' не является агрегированной функцией. 'DATEDIFF' должен содержаться в совокупной функции или внутри группы. Однако я согласен с вашей точкой зрения, что группировка по «DATE.ID» кажется излишней. – GarethD

+0

Спасибо за ответ. Мой запрос используется для вычитания дат X и Y и далее преобразует их в месяцы, если количество дней составляет> 100. У меня будут отдельные функции событий для создания Labelboxes, основанных на единицах числа (дней или месяцев), чтобы номера не были двусмысленными. ** Редактирование: ** Что касается идентификатора GROUP BY, я подозреваю, что элемент управления пытается отобразить все записи вместо текущего в форме. – DBonkins

+0

Я могу просто сбросить 'GROUP BY'. Но я получу ошибку '#Name? '. Моя цель - показать разницу дат между Date_X и Date_Y. – DBonkins

0

Я думаю, что ваша проблема в вашем DLookup, а не на ваш запрос. Вам не нужно GROUP BY вообще, это вызовет запрос к ошибке, вы можете просто сделать QueryB:

SELECT IIF(DATEDIFF("d",Date_X,Date_Y)>100), 
      ROUND(IIF(DATEDIFF("d",Date_X,Date_Y)/30,2), 
      DATEDIFF("d",Date_X,Date_Y) AS DATEDIFF_X_Y 
FROM LAB_DATES; 

Проблема заключается в том, что в вашем DLookup вы используете:

[LAB_DATES.ID] 

Где вы на самом деле хотите

[LAB_DATES].[ID] 

т.е. в его нынешней форме вы ищете колонки называется LAB_DATES.ID, а не колонка называется ID I n объект LAB_DATES.Изменение вашего DLookup к этому:

=DLookUp("[DATE_DIFF_X_Y]", 
     "[QueryB]", 
     "[LAB_DATES].[ID] = " & [Forms]![Lab Results Form]![Textbox_DATE_ID]) 

Если сделать трюк.