Ошибка: попытка выполнить запрос, который не включает указанное выражение...
Lowe
Дата: 26.12.2011 23:27:54
есть таблицы
[Люди]![Номер]
[Люди]![Фамилия]
у каждого человека свой номер. повторений нет (т.е. по сути Номер=Фамилия)
[Учёт]![Номер]
[Учёт]![Дата]
номера и даты могут повторятся
[Люди]![Номер] и [Учёт]![Номер] связаны
нужно создать запрос, чтобы вывелись столбцы
[Номер] [Дата]
чтобы самая ранняя дата у человека была за "октябрь текущего года"
с формулировкой долго думал, ничего умнее не вышло(
поэтому пример:
из данных
№1 2011.10.15
№1 2011.09.10
№2 2011.10.10
№2 2011.11.14
выдать только строку
№2 2011.10.10
___________________________________________
I) запрос просто по "самой ранней дате у человека" тоже получился
"Итоги"; [Учёт]![Дата] ставим вместо "Группировка" "Min"
выдаёт
№1 2011.09.10
№2 2011.10.10
II) запрос просто по дате можно сделать двумя вариантами:
а) Between #01.10.2011# And #31.10.2011#
б) Year([Учет]![Дата])=Year(Now()) And Month([Учет]![Дата])=10
результат абсолютно одинаковый, но второй вариант предпочтительнее, потому что в первом год задаётся руками, а во втором он автоматический
выдаёт
№1 2011.10.15
№2 2011.10.10
III)
объединяю I) и II)а) - работает, т.е. выдаёт "№2 2011.10.10"
объединяю I) и II)б) - НЕ работает
выдаёт:
попытка выполнить запрос, который не включает указанное выражение "Year([Учет]![Дата])=Year(Now()) And Month([Учет]![Дата])=10" как часть агрегатной функции.
П.С. вопрос свой перечитал, надеюсь, понятно сформулировал, хотя, блин, запутано вроде(
mds_world
Дата: 26.12.2011 23:50:40
Желательно бы полный текст запроса увидеть.
Но можно и так предположить, что условие записано в Having. Перенесите его во Where и все сработает
Lowe
Дата: 27.12.2011 00:36:42
1) рабочий (как образец) вариант:
SELECT Люди.Номер, Люди.Фамилия, Min(Учет.Дата) AS [Min-Дата]
FROM Люди INNER JOIN Учет ON Люди.Номер = Учет.[Номер]
GROUP BY Люди.Номер, Люди.Фамилия
HAVING (((Min(Учет.Дата)) Between #10/1/2011# And #10/31/2011#));
2) рабочий, но без выборки по минимальной дате
SELECT Люди.Номер, Люди.Фамилия, Учет.Дата
FROM Люди INNER JOIN Учет ON Люди.Номер = Учет.[Номер]
GROUP BY Люди.Номер, Люди.Фамилия, Учет.Дата
HAVING ((Year([Учет]![Дата])=Year(Now()) And Month([Учет]![Дата])=10));
добавляем к п.2) выборку по минимальной дате (чтобы было, как в п.1) ) и получаем
3) нерабочий (но нужный!) вариант
SELECT Люди.Номер, Люди.Фамилия, Min(Учет.Дата) AS [Min-Дата]
FROM Люди INNER JOIN Учет ON Люди.Номер = Учет.[Номер]
GROUP BY Люди.Номер, Люди.Фамилия
HAVING ((Year([Учет]![Дата])=Year(Now()) And Month([Учет]![Дата])=10));
П.С. делал в режиме конструктора, а не в режиме SQL
Lowe
Дата: 27.12.2011 00:41:14
простая замена HAVING на WHERE выдаёт ошибку
с режимом SQL сталкиваюсь в первый раз, поэтому с синтаксисом не знаком
Lowe
Дата: 27.12.2011 00:45:44
от блин
по отдельности
SELECT Люди.Номер, Люди.Фамилия, Min(Учет.Дата) AS [Min-Дата]
FROM Люди INNER JOIN Учет ON Люди.Номер = Учет.[Номер]
GROUP BY Люди.Номер, Люди.Фамилия, Учет.Дата
HAVING ((Year([Учет]![Дата])=Year(Now())));
и
SELECT Люди.Номер, Люди.Фамилия, Min(Учет.Дата) AS [Min-Дата]
FROM Люди INNER JOIN Учет ON Люди.Номер = Учет.[Номер]
GROUP BY Люди.Номер, Люди.Фамилия, Учет.Дата
HAVING ((Month([Учет]![Дата])=10));
работают ((
mds_world
Дата: 27.12.2011 00:57:43
Lowe |
---|
простая замена HAVING на WHERE выдаёт ошибку |
Да, потому что место им на разных этажах
SELECT Люди.Номер, Люди.Фамилия, Min(Учет.Дата) AS [Min-Дата]
FROM Люди INNER JOIN Учет ON Люди.Номер = Учет.[Номер]
where Year([Учет]![Дата])=Year(Now()) And Month([Учет]![Дата])=10
GROUP BY Люди.Номер, Люди.Фамилия
Lowe
Дата: 27.12.2011 01:26:06
из того примера
№1 10.09.2011
№1 15.10.2011
№2 10.10.2011
№2 14.11.2011
по этому запросу выдаёт
№1 15.10.2011
№2 10.10.2011
строка
№1 15.10.2011
должно исключаться, потому что для человека №1 есть более ранняя дата "10.09.2011"
переформулирую кривую фразу
"чтобы самая ранняя дата у человека была за "октябрь текущего года" "
в такую
"чтобы самое первое вхождение человека было в "октябре текущего года" "
_________________________
пошаманил в режиме конструктора, теперь
1) HAVING ____ ((Year([Учет]![Дата]) = Year(Now()) _And ____ Month([Учет]![Дата])=10));
2) where ______ Year([Учет]![Дата])_ = Year(Now()) _And ____ Month([Учет]![Дата])=10
3) HAVING (((Min(Year([Учет]![Дата])))=Year(Now())) AND ((Min(Month([Учет]![Дата])))=10));
1 - мой исходный
2 - ваш вариант
3 - этот крокодил после шаманства с вашим вариантом) он сам заменил where на having)))
вариант 3 выдаёт нужный результат! но в режиме конструктора такой ужас, что просто ппц))))
без режима SQL такой врядли смог бы составить... какбы за самодеятельность не наругали)
вобщем, СПАСИБО))))