Вложение функции MAX() внутри IIF()?

У меня есть вложенные функции IIF() в моем операторе select, а внутри каждой из них есть вложенные функции MAX(). Кажется, я хочу, чтобы я включил этот оператор выбора в GROUP BY. Вот мой запрос:

SELECT 
d2s_loader_performance_tbl.employee_id, 
IIF(d2s_loader_performance_tbl.wk_ending_dt=max(d2s_loader_performance_tbl.wk_ending_dt),"Last Wk",
  IIF(d2s_loader_performance_tbl.wk_ending_dt=max(d2s_loader_performance_tbl.wk_ending_dt)-7,"2 Wks Ago",
    IIF(d2s_loader_performance_tbl.wk_ending_dt=max(d2s_loader_performance_tbl.wk_ending_dt)-14,"3 Wks Ago",
      IIF(d2s_loader_performance_tbl.wk_ending_dt=max(d2s_loader_performance_tbl.wk_ending_dt)-21,"4 Wks Ago")))),
d2s_loader_performance_tbl.hrs_worked, 
d2s_loader_performance_tbl.move_count, 
d2s_loader_performance_tbl.moves_per_hour

FROM d2s_loader_performance_tbl
WHERE d2s_loader_performance_tbl.wk_ending_dt In (
SELECT DISTINCT TOP 4 wk_ending_dt 
FROM d2s_loader_performance_tbl
ORDER BY wk_ending_dt DESC)

GROUP BY 
d2s_loader_performance_tbl.employee_id,
d2s_loader_performance_tbl.move_count, 
d2s_loader_performance_tbl.moves_per_hour

Когда я запускаю, я получаю эту ошибку: «Вы пытались выполнить запрос, который не включает указанное выражение [перечисляет фрагмент, который является вложенным IIF] как часть агрегатной функции. Когда я помещаю это в GROUP BY (который не имеет смысла), я получаю эту ошибку: «Не может иметь агрегатную функцию в предложении GROUP BY»

Итак, что, с точки зрения двойной хоккейной клюшки, хочет от меня доступ? Смысл этого в том, чтобы превратить выходные даты в относительный термин. Этот отчет обновляется еженедельно, и я устал вручную просматривать все свои запросы и отчеты и менять ссылки на новые даты.

Спасибо!


person Trevor D    schedule 31.12.2013    source источник
comment
В каком формате указаны даты?   -  person mnky9800n    schedule 31.12.2013
comment
Когда я открываю таблицу в представлении «Дизайн», тип данных — «Дата/время», а в поле «Формат свойств поля» остается пустым. Будет ли функциональная разница между выбором Short Date и Long Date?   -  person Trevor D    schedule 31.12.2013
comment
Запрос выполняется правильно, выдает 28.12.13. Затем я пробую это SELECT Max(wk_ending_dt) AS MaxOfwk_ending_dt, Max(wk_ending_dt) - 7 AS MaxOfwk_ending_dt7 FROM d2s_loader_performance_tbl, чтобы проверить математику, и это тоже работает — я получаю 2 столбца, 28/12/13 и 21/12/13.   -  person Trevor D    schedule 31.12.2013


Ответы (1)


Как насчет того, чтобы поместить часть вашего запроса в подзапрос (или, может быть, даже в отдельный запрос). Так:

SELECT 
  orig.employee_id, 
  IIF(orig.wk_ending_dt=PreAgg.max_wk_ending_dt),"Last Wk",
    IIF(orig.wk_ending_dt=PreAgg.max_wk_ending_dt)-7,"2 Wks Ago",
      IIF(orig.wk_ending_dt=PreAgg.max_wk_ending_dt)-14,"3 Wks Ago",
        IIF(orig.wk_ending_dt=PreAgg.max_wk_ending_dt)-21,"4 Wks Ago")))),
  orig.hrs_worked, 
  orig.move_count, 
  orig.moves_per_hour
FROM (
  SELECT 
  d2s_loader_performance_tbl.employee_id, 
  max(d2s_loader_performance_tbl.wk_ending_dt) AS Max_wk_ending_dt

  FROM d2s_loader_performance_tbl

  GROUP BY 
  d2s_loader_performance_tbl.employee_id
) PreAgg JOIN d2s_loader_performance_tbl AS orig ON
PreAgg.employee_id=orig.employee_id

WHERE orig.wk_ending_dt In (
  SELECT DISTINCT TOP 4 wk_ending_dt 
  FROM d2s_loader_performance_tbl
  ORDER BY wk_ending_dt DESC)
person tgolisch    schedule 31.12.2013
comment
После некоторой настройки я получил ваше первое предложение работать так же, как я видел, как ваше редактирование прошло. Одно важное замечание: оператор WHERE в этом должен идти в родительском запросе. Мне кажется, что WHERE в подзапросе ограничивает выбор значения MAX - ненужного, поскольку значение MAX одинаково, независимо от того, выбираю ли я все значения или ограничиваю их верхними значениями n. Скорее, ему нужно WHERE в конце, чтобы ограничить основную тягу. Отличное предложение! - person Trevor D; 31.12.2013
comment
да. Хорошая мысль о предложении WHERE. Я поправлю это, выше. Спасибо. - person tgolisch; 01.01.2014