@iskanderqq

Как соединить строки в одну?

Как сделать sql запрос, чтобы в результате получить из таблицы(ms acces):
Продукция | Цех
Клей | цех1
Клей | цех2
Краска | цех3
Краска | цех1

Вот такой результат:

Продукция | Цех
Клей | цех1,цех2
Краска | цех3, цех1
  • Вопрос задан
  • 281 просмотр
Пригласить эксперта
Ответы на вопрос 3
Stalker_RED
@Stalker_RED
Так sql или ms-access? На каком языка вы пишете?
В MySQL это делается через group_concat(), и можно поискать аналоги:

www.rogersaccesslibrary.com/forum/generic-function...

https://database.guide/the-sql-server-equivalent-t...
Ответ написан
Alex_Geer
@Alex_Geer
System Engineer
Привет! Чтобы получить такой результат, можно использовать функцию GROUP_CONCAT в SQL запросе. Вот пример кода:

SELECT Продукция, GROUP_CONCAT(Цех SEPARATOR ',') AS Цех
FROM таблица
GROUP BY Продукция
Ответ написан
Комментировать
@Akina
Сетевой и системный админ, SQL-программист.
MS Access не имеет функции групповой конкатенации.

Проблема решается путём создания пользовательской функции и использования её в запросе.

Function group_concat(category As String) As String
With CurrentDb.OpenRecordset("SELECT [Цех] FROM [Имя таблицы] WHERE [Продукция] = '" & category & "'")
    group_concat = ""
    .MoveFirst
    While Not .EOF
        group_concat = group_concat & "," & ![Цех]
        .MoveNext
    Wend
    .Close
End With
group_concat = Mid(group_concat, 2)
End Function

Поскольку пользовательская функция - скалярная, и не агрегатная, её нужно оборачивать какой-либо агрегатной функцией.
SELECT [Продукция], MAX(group_concat([Цех])) AS [Цех]
FROM [Имя таблицы]
GROUP BY [Продукция];


PS. Конечно, функцию можно сделать более универсальной, передавая в неё имена таблицы и полей, а также маркер типа данных поля категории.

---
Ну или взять готовую DConcat() от Patrick G. Matthews: https://www.experts-exchange.com/articles/2380/Dom...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы