Создание агрегированного отчета SQL, в котором столбцы основаны на списке таблиц

#sql #ms-access-2013

#sql #ms-access-2013

Вопрос:

Не уверен, что это возможно, но я надеюсь, что кто-нибудь сможет указать мне правильное направление.

У меня есть база данных, которая проверяет журналы при изменении записи на этапе. Что мне нужно сделать, так это объединить эту резервную копию в отчет, который предоставляет мне самую раннюю запись аудита для каждого этапа по идентификатору записи. т. Е. в итоге я получаю отчет, который выглядит следующим образом.

  ---- --------- --------- --------- 
| ID | Stage1  | Stage2  | Stage3  |
 ---- --------- --------- --------- 
|  1 | 1/10/20 | 1/10/20 | 3/10/20 |
|  2 | 1/10/20 | 2/10/20 | 4/10/20 |
|  3 | 2/10/20 | 2/10/20 | 3/10/20 |
 ---- --------- --------- --------- 
  

Я могу сделать это с помощью нескольких запросов select, но поскольку мои этапы хранятся в таблице, мне было интересно, есть ли способ построить это динамически. Это также позволило бы свести к минимуму обслуживание в будущем.

Моя таблица «Audit_Log» содержит следующие столбцы:

  • Идентификатор записи
  • Этап
  • Event_Date

Мои «Этапы» хранятся в таблице под названием «Этапы», столбец «Stage».

Любые предложения будут действительно оценены. Спасибо

Ответ №1:

Вы можете попробовать использовать operator TRANSFORM .

 TRANSFORM <aggregate-function-expression>
  <select-statement>
PIVOT <expression>
[IN (<column-value-list>)]
  

где <aggregate-function-expression> — выражение , созданное с помощью одной из агрегатных функций,

<select-statement> содержит предложение GROUP BY, <column-value-list> представляет собой список обязательных значений, которые, как ожидается, будут возвращены выражением PIVOT, заключенный в кавычки и разделенный запятыми. (Вы можете использовать предложение IN для принудительного ввода последовательности вывода столбцов.)

Если есть значение event_date для RecordID и Stage:

 TRANSFORM Max(Audit_Log.Event_Date)AS stage_date
SELECT Audit_Log.RecordID
FROM Audit_Log
GROUP BY Audit_Log.RecordID
PIVOT Audit_Log.Stage
  

Комментарии:

1. Идеально! Пользователи имели возможность добавлять отдельные этапы, поэтому возвращалось слишком много столбцов, но добавление WHERE В подзапросе к Stage означало, что я могу ограничить его формальными этапами.

2. Спасибо) Вы можете использовать инструкцию where after ИЗ Audit_Log, например: ИЗ Audit_Log WHERE Stage in (‘Stage1’, ‘Stage2’, ‘Stage3’) или после оператора PIVOT