Подтвердить что ты не робот

Запрос доступа Ms: объединение строк через запрос

Предположим, что у меня есть таблица в Ms Access со следующей информацией:

ColumnA ColumnB
1       abc
1       pqr
1       xyz
2       efg
2       hij
3       asd

Мой вопрос в том, как я могу объединить значения во втором столбце со значением строки на основе первого столбца. Результаты запроса, которые я хочу, следующие:

ColumnA ColumnB
1       abc, pqr, xyz
2       efg, hij
3       asd

Я хочу достичь этого с помощью запроса. Может ли кто-нибудь помочь мне достичь этого?

4b9b3361

Ответ 2

Здесь выдающаяся ссылка re: как это сделать из SQL, вызывая функцию. Инструкции исключительно понятны, и функция написана для вас, поэтому вы можете просто скопировать, вставить и перейти. Даже тот, кто не знает VB, может легко реализовать его: Объединить значения из связанных записей

Ответ 3

это может быть очень трудно получить. Если вы ДОЛЖНЫ сделать это в запросе, а не в функции, проблема, с которой вы столкнетесь, - это предел количества строк, которые вы можете объединить в один столбец. Пока единственный способ, который я нашел для этого, - это выполнить инструкции iif.

SELECT 
test1.ColumnA AS ColumnA, 
First([test1].[ColumnB]) & IIf(Count([test1].[ColumnB])>1,"," & Last([test1].[ColumnB])) AS ColumnB
FROM test1
GROUP BY test1.ColumnA;

возвращает:

ColumnA  ColumnB 
1      abc,xyz 
2      efg,hij 
3      asd

Это вернет только первое и последнее, но я уверен, что с небольшой работой вы могли бы выработать функцию "Выбрать", но, как я уже сказал, вам нужно будет добавить несколько инструкций iif для каждого дополнительного элемента, который вы хотите добавить, следовательно, ограничение.

Ответ 4

В таблице может быть столбец последовательностей, который дает ему уникальный первичный ключ последовательности ColumnA:

table: t1
ColumnA sequence ColumnB
1       1        abc
1       2        pqr
1       3        xyz
2       1        efg
2       2        hij
3       1        asd

И может быть создан Crosstab:

query: x1
TRANSFORM Min([columnB] & ", ") AS Expr1
SELECT t1.columnA
FROM t1
GROUP BY t1.columnA
PIVOT t1.sequence;

columnA 1    2    3
1       abc, pqr, xyz,
2       efg, hij,
3       asd,

Затем окончательный запрос может объединить столбцы и удалить последнюю запятую:

SELECT x1.columnA, Left([1] & [2] & [3],Len([1] & [2] & [3])-2) AS columnB FROM x1;

columnA columnB
1       abc, pqr, xyz
2       efg, hij
3       asd

Чтобы автоматизировать заполнение последовательности, можно использовать следующий код VBA:

Sub fill_sequence_t1()
  Dim i: i = 1
  Do While DCount("*", "t1", "sequence IS NULL") > 0
    DoCmd.RunSQL "SELECT t1.columnA, Min(t1.columnB) AS columnB_min INTO t2" & _
                 " FROM t1 WHERE t1.sequence IS NULL GROUP BY t1.columnA;"
    DoCmd.RunSQL "UPDATE t1 INNER JOIN t2 ON (t1.columnA = t2.columnA)" & _
                 " AND (t1.columnB = t2.columnB_min) SET t1.sequence=" & i
    CurrentDb.TableDefs.Delete "t2"
    i = i + 1
  Loop
End Sub