Я пытаюсь вернуть данные за последние 4 года, если они есть. Таблица (назовите ее A_TABLE) выглядит следующим образом: ID, Год, Val
Идея запроса заключается в следующем: для каждого идентификатора / года в таблице, LEFT JOIN с Year-1, Year-2 и Year-3 (чтобы получить данные за 4 года), а затем вернуть Val для каждого года , Вот SQL:
SELECT a.ID, a.year AS [Year], a.Val AS VAL,
a1.year AS [Year-1], a1.Val AS [VAL-1],
a2.year AS [Year-2], a2.Val AS [VAL-2],
a3.year AS [Year-3], a3.Val AS [VAL-3]
FROM (
([A_TABLE] AS a
LEFT JOIN [A_TABLE] AS a1 ON (a.ID = a1.ID) AND (a.year = a1.year+1))
LEFT JOIN [A_TABLE] AS a2 ON (a.ID = a2.ID) AND (a.year = a2.year+2))
LEFT JOIN [A_TABLE] AS a3 ON (a.ID = a3.ID) AND (a.year = a3.year+3)
Проблема в том, что в прошлые годы, когда нет данных (например, год-1), я вижу «#Error» в соответствующем столбце VAL (например, [VAL-1]). Странно то, что я вижу ожидаемое значение «ноль» в столбце «Год» (например, [ГОД-1]).
Некоторые примеры данных:
ID YEAR VAL
Dave 2004 1
Dave 2006 2
Dave 2007 3
Dave 2008 5
Dave 2009 0
выводит так:
ID YEAR VAL YEAR-1 VAL-1 YEAR-2 VAL-2 YEAR-3 VAL-3
Dave 2004 1 #Error #Error #Error
Dave 2006 2 #Error 2004 1 #Error
Dave 2007 3 2006 2 #Error 2004 1
Dave 2008 5 2007 3 2006 2 #Error
Dave 2009 0 2008 5 2007 3 2006 2
Имеет ли это смысл? Почему я получаю соответствующий NULL val для несуществующих YEAR, но #Error для несуществующих VAL?
(Это Access 2000. Условные операторы типа «IIf (a1.val is null, -999, a1.val)», похоже, ничего не делают.)
РЕДАКТИРОВАТЬ: Оказывается, что ошибки как-то вызваны тем, что A_TABLE на самом деле является запросом. Когда я помещаю все данные в реальную таблицу и выполняю один и тот же запрос, все отображается так, как должно. Всем спасибо за помощь.