#vba #ms-access
Вопрос:
У меня есть таблица в базе данных Access, я хотел бы преобразовать AT_cd
столбец в строки с помощью SQL-запроса в MS Access (как показано ниже в таблице результатов), но я не могу преобразовать его правильно. Я попытался преобразовать, используя приведенный ниже запрос, но он преобразует AT_cd в 200 столбцов. Я не уверен, как исправить свой запрос. Ниже приведена примерная таблица и таблица желаемых результатов. Любая помощь очень ценится.
Стол:
ID AT_cd
01 BB01A
01 IZ76N
02 AC21B
02 AX30A
02 ZA98A
03 AC21N
03 ZA76M
03 RT67T
04 QS70P
04 TR67A
04 GB45L
04 AC78M
Желаемый результат:
ID AT_cd1 AT_cd2 AT_cd3 AT_cd4
01 BB01A IZ76N
02 AC21B AX30A ZA98A
03 AC21N ZA76M RT67T
04 QS70P TR67A GB45L AC78M
Код:
TRANSFORM FIRST(AT_cd)
SELECT [ID]
FROM Table1
GROUP BY [ID]
PIVOT AT_cd
Ответ №1:
С DCount
помощью этого запроса вы можете приблизиться, который также будет сортировать значения столбцов:
TRANSFORM
First(QueryQ.AT_cd)
SELECT
QueryQ.ID
FROM
(SELECT
ID,
AT_cd,
"AT_cd" amp; CStr(DCount("*", "TableQ", "[ID] = '" amp; ID amp; "' And [AT_cd] <= '" amp; AT_cd amp; "'")) AS Sequence
FROM
TableQ) As QueryQ
GROUP BY
QueryQ.ID
PIVOT
QueryQ.Sequence;
Правка: От Дуэйна Хукома мне был предложен этот альтернативный метод, использующий только SQL, таким образом, возможно, быстрее:
TRANSFORM
First(QueryQ.AT_cd)
SELECT
QueryQ.ID
FROM
(SELECT TableQ.ID, TableQ.AT_cd, Count(TableQ.AT_cd) AS Sequence
FROM TableQ
INNER JOIN TableQ AS TableQ_1 ON TableQ.ID = TableQ_1.ID
WHERE (((TableQ.AT_cd)>=[TableQ_1].[AT_cd]))
GROUP BY TableQ.ID, TableQ.AT_cd) As QueryQ
GROUP BY
QueryQ.ID
PIVOT
"AT_cd" amp; QueryQ.Sequence;
Комментарии:
1. Спасибо, Густав, это работает очень хорошо!!
Ответ №2:
Я боюсь, что то, чего вы хотите, невозможно. Вы пытаетесь получить результаты на основе порядка записей в списке записей, и это невозможно сделать. Вам нужно создать определенное поле с указанием заказа, и тогда вы сможете это сделать. Поле, в котором указывается порядок, будет выглядеть примерно так:
ID AT_cd Order
01 BB01A AT_cd1
01 IZ76N AT_cd2
02 AC21B AT_cd1
02 AX30A AT_cd2
02 ZA98A AT_cd3
03 AC21N AT_cd1
03 ZA76M AT_cd2
03 RT67T AT_cd3
04 QS70P AT_cd1
04 TR67A AT_cd2
04 GB45L AT_cd3
04 AC78M AT_cd4
Как только вы это сделаете, следующее ПРЕОБРАЗОВАНИЕ приведет к желаемому результату:
TRANSFORM First(AT_cd)
SELECT ID
FROM Table_name
GROUP BY ID
ORDER BY ID
PIVOT Order
Более подробная информация на LightningGuide.net.