Как я могу получить:
id Name Value
1 A 4
1 B 8
2 C 9
в
id Column
1 A:4, B:8
2 C:9
Как я могу получить:
id Name Value
1 A 4
1 B 8
2 C 9
в
id Column
1 A:4, B:8
2 C:9
GROUP_CONCAT()
агрегатной функции, но решить ее на Microsoft SQL Server гораздо сложнее. Для получения справки см. Следующий вопрос: « Как получить несколько записей для одной записи на основе отношения? »Ответы:
Не требуется CURSOR, цикл WHILE или пользовательская функция .
Просто нужно быть креативным с FOR XML и PATH.
[Примечание: это решение работает только на SQL 2005 и более поздних версиях. В оригинальном вопросе не указана используемая версия.]
источник
Если это SQL Server 2017 или SQL Server Vnext, SQL Azure вы можете использовать string_agg, как показано ниже:
источник
использование пути XML не будет идеально объединено, как вы могли бы ожидать ... оно заменит "&" на "& amp;" и также будет связываться с
<" and ">
... может быть, несколько других вещей, не уверен ... но вы можете попробовать этоЯ нашел обходной путь для этого ... вам нужно заменить:
с:
... или
NVARCHAR(MAX)
если это то, что вы используете.почему, черт возьми, нет
SQL
объединенной агрегатной функции? это питаисточник
Я столкнулся с несколькими проблемами , когда я попытался преобразовать предложение Kevin Fairchild для работы со строками , содержащих пробелы и специальные символы XML (
&
,<
,>
) , которые кодируются.Окончательная версия моего кода (которая не отвечает на первоначальный вопрос, но может быть полезна кому-то) выглядит следующим образом:
Вместо использования пробела в качестве разделителя и замены всех пробелов запятыми, он просто добавляет запятую и пробел к каждому значению, а затем использует их
STUFF
для удаления первых двух символов.Кодировка XML обеспечивается автоматически с помощью директивы TYPE .
источник
Еще один вариант использования Sql Server 2005 и выше
источник
Установите агрегаты SQLCLR с http://groupconcat.codeplex.com
Затем вы можете написать такой код, чтобы получить результат, который вы просили:
источник
SQL Server 2005 и более поздние версии позволяют создавать собственные настраиваемые агрегатные функции , в том числе для таких вещей, как конкатенация - см. Образец внизу связанной статьи.
источник
Восемь лет спустя ... Ядро базы данных Microsoft SQL Server vNext наконец-то улучшило Transact-SQL для прямой поддержки конкатенации сгруппированных строк. В техническом обзоре сообщества версии 1.0 добавлена функция STRING_AGG, а в CTP 1.1 добавлено предложение WITHIN GROUP для функции STRING_AGG.
Ссылка: https://msdn.microsoft.com/en-us/library/mt775028.aspx
источник
Это всего лишь дополнение к посту Кевина Фэйрчайлда (кстати, очень умный). Я бы добавил это как комментарий, но у меня пока недостаточно очков :)
Я использовал эту идею для представления, над которым работал, однако элементы, которые я объединял, содержали пробелы. Поэтому я немного изменил код, чтобы не использовать пробелы в качестве разделителей.
Еще раз спасибо за классный обходной путь, Кевин!
источник
Примером будет
В Oracle вы можете использовать агрегатную функцию LISTAGG.
Оригинальные записи
SQL
Результат в
источник
Этот тип вопросов здесь задают очень часто, и решение будет во многом зависеть от базовых требований:
https://stackoverflow.com/search?q=sql+pivot
а также
https://stackoverflow.com/search?q=sql+concatenate
Как правило, нет единственного SQL-способа сделать это без динамического sql, пользовательской функции или курсора.
источник
Просто чтобы добавить к тому, что сказал Кейд, это, как правило, интерфейсный дисплей, и поэтому его следует обрабатывать там. Я знаю, что иногда проще написать что-то на 100% в SQL для таких вещей, как экспорт файлов или другие решения «только для SQL», но в большинстве случаев эта конкатенация должна обрабатываться на вашем уровне отображения.
источник
Не нужен курсор ... цикла while достаточно.
источник
Давайте получим очень просто:
Заменить эту строку:
С вашим запросом.
источник
не видел перекрестных ответов, также не нужно извлекать XML. Вот немного другая версия того, что написал Кевин Фэйрчайлд. Это быстрее и проще для использования в более сложных запросах:
источник
Вы можете значительно повысить производительность следующим образом, если группа по содержит в основном один элемент:
источник
Использование функции замены и FOR JSON PATH
Для образца данных и других способов нажмите здесь
источник
Если у вас включен clr, вы можете использовать библиотеку Group_Concat из GitHub
источник