Объединить поля из одного столбца в запросе Microsoft Access - PullRequest
0 голосов
/ 11 сентября 2018

Я хотел бы объединить поля из одного столбца в запросе. Моя таблица в Microsoft Access выглядит так:

| Cluster1  |  Cluster2  |  Reason   |
|-----------|------------|-----------|
| Cluster A | Cluster A1 | Reason 1  |
| Cluster A | Cluster A1 | Reason 2  |
| Cluster A | Cluster A2 | Reason 3  |
| Cluster A | Cluster A2 | Reason 4  |
| Cluster B | Cluster B1 | Reason 5  |
| Cluster B | Cluster B1 | Reason 6  |
| Cluster B | Cluster B1 | Reason 7  |
| Cluster B | Cluster B1 | Reason 8  |
| Cluster B | Cluster B1 | Reason 9  |
| Cluster B | Cluster B2 | Reason 10 |

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

| Cluster1  |  Cluster2  |                   Reason                     |
|-----------|------------|----------------------------------------------|
| Cluster A | Cluster A1 | Reason1,Reason 2                             |
| Cluster A | Cluster A2 | Reason3,Reason 4                             |
| Cluster B | Cluster B1 | Reason 5,Reason 6,Reason 7,Reason 8,Reason 9 |
| Cluster B | Cluster B2 | Reason 10                                    |

Я нашел уже несколько похожих вопросов, но они были более простыми, и я, к сожалению, не смог приспособить их к своему делу. Я узнал, что должен использовать код Concatenate VBA от Allen Browne, и с этим я мог подражать более простому примеру.


Решение Zacharey будет очень хорошо работать с моими тестовыми данными, но когда я пытаюсь использовать его с моими реальными данными, которые имеют около 200 000 записей с 5000 основным кластером (cluster1), оно никогда не заканчивается для расчета. Только когда я чрезвычайно уменьшаю объем фильтрации строк данных только на одну букву алфавита (как A *), я получаю результат через 2-4 часа. В настоящее время я начал запускать его вручную для каждого основного кластера и добавлять его в таблицу, но, похоже, он неэффективен. У вас есть идея, как я мог бы ускорить это. Я предполагаю создание фильтра (примерно 5000 с примерно 50 строками данных в каждой), который обрабатывает каждый основной кластер поочередно и затем выполняет запрос, или создает временную таблицу 5000 раз и выполняет затем запрос 5000 раз с 50 строками только ускорит обработка, но я никогда не делал что-то подобное. У вас есть пример кода, который я мог бы попытаться настроить в соответствии со своими потребностями?

Ответы [ 2 ]

0 голосов
/ 11 сентября 2018

вот ваше решение:

MySQL Solution

В MySQL вы можете легко использовать функцию GROUP_CONCAT. Код для этого приведен ниже:

select `Cluster 1`, `Cluster 2`, GROUP_CONCAT(`Reason`) as Reason
from test
group by `Cluster 1`, `Cluster 2`

И здесь вы можете получить ссылку на пример fiddle , который иллюстрирует это.

Как использовать в Access

В доступе у вас нет этой функции естественным образом, но, как вы написали в своем вопросе, кто-то по имени Аллен Браун создал пользовательскую функцию для достижения того же результата ( ссылка ).

В ссылке вы можете прочитать ясный способ реализации этого в разделе How to use the function. Вам просто нужно добавить модуль с представленной функцией, скомпилировать и использовать его.

Эквивалентный код в Access

Я считаю, что код в MySQL, переведенный на то же решение в MS Access, будет:

SELECT test.[Custer 1], test.[Cluster 2], ConcatRelated("Reason","test", "test.[Custer 1]&test.[Cluster 2] = """ & test.[Custer 1]&test.[Cluster 2] & """") AS Reason
FROM test
GROUP BY test.[Custer 1], test.[Cluster 2];
0 голосов
/ 11 сентября 2018
SELECT Distinct
    table.Cluster1,
    table.Cluster2,
    ConcatRelated("Reason", "table", "Cluster1=""" & [Cluster1] & """ and Cluster2=""" & [Cluster2] & """") AS Reasons
FROM table;

Это работает для вас? Вам действительно нужно использовать ConcatRelated от Аллена Брауна

...