Преобразование/Транспонирование строк в столбцы в MS Access

#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.