powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как объединить несколько строк в одну
20 сообщений из 20, страница 1 из 1
Как объединить несколько строк в одну
    #40118740
Romanov-krd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
есть код
Код: sql
1.
select distinct name from t1



выдает в разных строках
name1
name2
name3

как сделать чтобы выдавал в одной ячейки?
name1 name2 name3
...
Рейтинг: 0 / 0
Как объединить несколько строк в одну
    #40118752
Фотография komrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Как объединить несколько строк в одну
    #40118758
Romanov-krd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
komrad,

а как не используя sys.columns может функции какие то есть?
...
Рейтинг: 0 / 0
Как объединить несколько строк в одну
    #40118760
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Romanov-krd,

у вас какие-то религиозные ограничения на чтение справки?
https://docs.microsoft.com/ru-ru/sql/t-sql/functions/string-functions-transact-sql?view=sql-server-ver15
...
Рейтинг: 0 / 0
Как объединить несколько строк в одну
    #40118791
Фотография komrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Romanov-krd
komrad,

а как не используя sys.columns может функции какие то есть?


в том примере таблица sys.columns, а у вас t1
просто поправьте запрос под ваши нужды
...
Рейтинг: 0 / 0
Как объединить несколько строк в одну
    #40118797
Двоичник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Как объединить несколько строк в одну
    #40119459
Alex_Toms
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Romanov-krd

Как я понимаю, значение поля name из трёх записей собрать в строку и вывести одной записью.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
declare @s varchar(max)
set @s = ''

select @s = @s + ' ' + name
from (
  select 'name1' name union all
  select 'name2' name union all
  select 'name3' name 
) t

if len(@s) > 0
   set @s = substring(@s, 2, len(@s) - 1) 

select @s names
...
Рейтинг: 0 / 0
Как объединить несколько строк в одну
    #40119581
L_argo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что за бред с юнионами ? А если их понадобится 20 ? Динамический скл тоже не всегда применим.
Сделайте функцию:

declare @str varchar(500)

set @str=''

select @str = @str+','+ MyField....
from MyTable .....
where ...

можно навернуть сложную логику.
Oчень удобно применять эту ф-цию в секции select.
...
Рейтинг: 0 / 0
Как объединить несколько строк в одну
    #40119628
Alex_Toms
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
L_argo

Что значит бред, это для примера, понятное дело вместо юниона будет какая то своя таблица.
...
Рейтинг: 0 / 0
Как объединить несколько строк в одну
    #40119689
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
L_argo
Oчень удобно применять эту ф-цию в секции select

Ага. Скалярку. Внутри которой ещё и запрос. Быстродействие будет самое то.
Нормальных вариантов для использования в запросе здесь 2: string_agg, если позволяет версия, и for xml path(''), если не позволяет.
...
Рейтинг: 0 / 0
Как объединить несколько строк в одну
    #40119841
L_argo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Внутри которой ещё и запрос. Быстродействие будет самое то.Ну и пусть будет. Кому мешает ? :)
Многократно применял данный подход на выборках из десятков млн. строк. Ниодного случая с негативным результатом.
Удобство и гибкость гораздо важнее "медленного" запроса, обычно выполняемого ночью.

На самом деле остальные подходы существенно ничем не быстрее.
...
Рейтинг: 0 / 0
Как объединить несколько строк в одну
    #40119844
Фотография Ennor Tiegael
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
L_argo
Внутри которой ещё и запрос. Быстродействие будет самое то.
Ну и пусть будет. Кому мешает ? :)
Многократно применял данный подход на выборках из десятков млн. строк. Ниодного случая с негативным результатом.
Удобство и гибкость гораздо важнее "медленного" запроса, обычно выполняемого ночью.

На самом деле остальные подходы существенно ничем не быстрее.Вы, когда в сарказме упражняетесь, ставьте какие-нибудь смайлики, что ли. Мы-то понимаем, о чем речь, а вот новички могут и повестись.
...
Рейтинг: 0 / 0
Как объединить несколько строк в одну
    #40119874
L_argo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ennor Tiegael
Вы, когда в сарказме упражняетесь, ставьте какие-нибудь смайлики, что ли. Мы-то понимаем, о чем речь, а вот новички могут и повестись.
В чем сарказм ? Успешно применяю данный подход уже лет 20.
Было буквально пару случаев, когда подход создавал критичные тормоза (но и код в ф-ции был вынужденно сложным). Приходилось идти немного другими путями.

Но в 99% случаев подход идеально просто и быстро решал задачу. Без малейших проблем с производительностью.
Помним, что время разработчика также критично для бизнеса, как и скорость кода, который он пишет.

зы: Коллеги-хейтеры, лучше бы Вы хейтили мегатормозой промышленный код от MS, Adobe и прочих 1С. И не забыть упомянуть тормоза Джавы/ЖС и прочих питонов.

Хочется поумничать ? ОК. Выкладывайте сравнительное исследование про плюсы/минусы каждого из подходов. А публика пусть оценивает...
...
Рейтинг: 0 / 0
Как объединить несколько строк в одну
    #40119927
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
L_argo
На самом деле остальные подходы существенно ничем не быстрее.
У остальных подходов проблем нет, в отличие от пропагандируемого вами.
https://web.archive.org/web/20071227134945/http://support.microsoft.com/kb/287515

ЗЫ: И обсуждалось это уже многократно.
...
Рейтинг: 0 / 0
Как объединить несколько строк в одну
    #40119945
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, может так
Код: sql
1.
SELECT   city, STRING_AGG(email,';') email_list FROM   sales.customers GROUP BY   city;



https://www.sqlservertutorial.net/sql-server-string-functions/sql-server-string_agg-function/]
...
Рейтинг: 0 / 0
Как объединить несколько строк в одну
    #40119972
L_argo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг Хупин
Ну, может так
Код: sql
1.
SELECT   city, STRING_AGG(email,';') email_list FROM   sales.customers GROUP BY   city;



https://www.sqlservertutorial.net/sql-server-string-functions/sql-server-string_agg-function/]
Да, есть такая. Но с версии 2014, кажется.
...
Рейтинг: 0 / 0
Как объединить несколько строк в одну
    #40119974
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
L_argo
Ролг Хупин
Ну, может так
Код: sql
1.
SELECT   city, STRING_AGG(email,';') email_list FROM   sales.customers GROUP BY   city;



https://www.sqlservertutorial.net/sql-server-string-functions/sql-server-string_agg-function/]
Да, есть такая. Но с версии 2014, кажется.


ТС же не написал, для какой версии вопрос
...
Рейтинг: 0 / 0
Как объединить несколько строк в одну
    #40120143
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
L_argo
Хочется поумничать ? ОК. Выкладывайте сравнительное исследование про плюсы/минусы каждого из подходов. А публика пусть оценивает...

Да не вопрос.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
set statistics time on;
go
set statistics io on;
go

select
  i.name, stuff(f.x.value('.', 'nvarchar(4000)'), 1, 2, '') columns
from sys.indexes i  with(nolock)
cross join master..spt_values v
cross apply (
  select ', '+c.name
  from sys.index_columns ic with(nolock)
  join sys.columns c with(nolock) on c.object_id=ic.object_id and c.column_id=ic.column_id
  where ic.object_id=i.object_id and ic.index_id=i.index_id
  order by ic.key_ordinal
  for xml path(''), type
) f(x)
where i.type in (1,2) and v.type='P' and v.number between 1 and 100;


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SQL Server parse and compile time: 
   CPU time = 16 ms, elapsed time = 17 ms.

(2518900 rows affected)
Table 'spt_values'. Scan count 1, logical reads 4, physical reads 0, read-ahead reads 8, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'syscolpars'. Scan count 0, logical reads 223578, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'sysiscols'. Scan count 25189, logical reads 76264, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'sysidxstats'. Scan count 1, logical reads 757, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

SQL Server Execution Times:
   CPU time = 6396 ms,  elapsed time = 19098 ms.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
create function dbo.fnIndexColumns(@object_id int, @index_id int)
returns nvarchar(4000)
as
begin
  declare
    @s nvarchar(4000);
  set @s='';
  select
    @s=@s+', '+c.name
  from sys.index_columns ic with(nolock)
  join sys.columns c with(nolock) on c.object_id=ic.object_id and c.column_id=ic.column_id
  where ic.object_id=@object_id and ic.index_id=@index_id
  order by ic.key_ordinal;
  if len(@s)>2
    set @s=stuff(@s, 1, 2, '');
  return @s;
end;
go


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
set statistics time on;
go
set statistics io on;
go
select
  i.name, dbo.fIndexColumns(i.object_id, i.index_id) columns
from sys.indexes i  with(nolock)
cross join master..spt_values v
where i.type in (1,2) and v.type='P' and v.number between 1 and 100;;


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
SQL Server parse and compile time: 
   CPU time = 13 ms, elapsed time = 13 ms.

(2518900 rows affected)
Table 'Worktable'. Scan count 1, logical reads 66800, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'sysidxstats'. Scan count 1, logical reads 757, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'spt_values'. Scan count 1, logical reads 4, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

SQL Server Execution Times:
   CPU time = 383310 ms,  elapsed time = 389880 ms.
...
Рейтинг: 0 / 0
Как объединить несколько строк в одну
    #40120168
L_argo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловны,

Спасибо. Хорошее сравнение.
Первая конструкция значительно быстрее.
А как будет выглядеть конструкция, если понадобится применить сцепку полей с группировкой ? А если нужно использовать более одной такой конструкции в одном запросе ?

В случае скалярной ф-ции достаточно вставить ее в секцию group by. Если таких ф-ций будет не одна - тоже не проблема.
Да, скорость при этом будет не очень. Но критичным это будет далеко не всегда. По моим наблюдениям - редко.
...
Рейтинг: 0 / 0
Как объединить несколько строк в одну
    #40120175
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
L_argo
В случае скалярной ф-ции достаточно вставить ее в секцию group by. Если таких ф-ций будет не одна - тоже не проблема.

Сделать из подзапроса cross apply с for xml инлайновую табличную функцию тоже не проблема. Быстродействие будет практически то же самое, как и у варианта с подзапросом. И в group by вставлять поле из инлайновой функции.
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как объединить несколько строк в одну
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]