Я бы атаковал это при доступе, используя операторы IIF (думайте как операторы CASE в других базах данных). IIF в Access возвращает значение, когда указанное условие истинно (после первой запятой), или другое значение, если оно оценивается как ложное (после второй запятой). Поскольку вы используете логические значения, проверка на истинное состояние и скопление через совокупную сумму помогут вам.
SELECT Month(EventDate) AS TheMonth, Year(EventDate) AS TheYear,
SUM(IIF(Lunch, 1, 0)) AS LunchCount,
SUM(IIF(Snacks, 1, 0)) AS SnackCount,
SUM(IIF(Tea, 1, 0)) AS TeaCount
FROM YourTable
GROUP BY Month(EventDate), Year(EventDate)
ORDER BY Month(EventDate), Year(EventDate)
Приведенный выше запрос о возвращении курса считается за все месяцы и годы, однако вы можете легко ввести диапазон дат, как показано ниже.
SELECT Month(EventDate) AS TheMonth, Year(EventDate) AS TheYear,
SUM(IIF(Lunch, 1, 0)) AS LunchCount,
SUM(IIF(Snacks, 1, 0)) AS SnackCount,
SUM(IIF(Tea, 1, 0)) AS TeaCount
FROM YourTable
WHERE EventDate BETWEEN #1/1/2009# AND #1/31/2009#
GROUP BY Month(EventDate), Year(EventDate)
ORDER BY Month(EventDate), Year(EventDate)