Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Объединение строк  [new]
gigar
Member

Откуда:
Сообщений: 16
Добрый день.
Есть две таблицы
price_list (столбцы номер прейскуранта и id клиента):
price_list_num || price_list_clients_id
11 1
11 3
11 7
12 8

clients(столбцы id клиента и название организации):
clients_id|| clients_name
1 магазин 1
3 магазин 2
7 магазин 3
8 магазин 4

Как сделать объединение строк в столбце название организации через запятую? Пробовал так:
SELECT
price_list.price_list_num
stuff(( select ','+cast(clients_name as nvarchar) as 'data()' from clients
where clients.clients_id=price_list.price_list_clients_id
for xml path('') ),1,1,'')
FROM price_list
group by price_list_num,price_list_clients_id

Но названия организаций указывает верно, но нет группировки.
Спасибо.
30 май 18, 09:55    [21452624]     Ответить | Цитировать Сообщить модератору
 Re: Объединение строк  [new]
Kopelly
Member

Откуда: Красноярск
Сообщений: 289
gigar,

1. Вложенный запрос (который "FOR XML") формируй по price_list_num, а не по price_list_clients_id.
2. Убири группировку по price_list_clients_id.
30 май 18, 10:33    [21452719]     Ответить | Цитировать Сообщить модератору
 Re: Объединение строк  [new]
gigar
Member

Откуда:
Сообщений: 16
Но ведь price_list_num есть только в одной таблице
30 май 18, 10:51    [21452789]     Ответить | Цитировать Сообщить модератору
 Re: Объединение строк  [new]
Kopelly
Member

Откуда: Красноярск
Сообщений: 289
gigar,

Что мешает запихнуть ее во вложенный запрос?
30 май 18, 10:57    [21452812]     Ответить | Цитировать Сообщить модератору
 Re: Объединение строк  [new]
gigar
Member

Откуда:
Сообщений: 16
Запрос тогда выводит все существующие организации через запятую, а надо чтобы группировалось по price_list_num
30 май 18, 11:07    [21452855]     Ответить | Цитировать Сообщить модератору
 Re: Объединение строк  [new]
gigar
Member

Откуда:
Сообщений: 16
Кто-нибудь может помочь?
30 май 18, 11:54    [21453166]     Ответить | Цитировать Сообщить модератору
 Re: Объединение строк  [new]
LameUser
Member

Откуда:
Сообщений: 2028
gigar
Кто-нибудь может помочь?


Офорите свои запросы через разметку кода.
Добавте табличные переменные с заполнением данных.
Объясните что хотите получить на выходе (в виде таблице).

Шанс получения помощи сильно увеличится!
30 май 18, 12:10    [21453295]     Ответить | Цитировать Сообщить модератору
 Re: Объединение строк  [new]
Щукина Анна
Member

Откуда:
Сообщений: 1467
gigar,

помочь МОГУТ многие. но мало кто ХОЧЕТ помогать.

Вопрос ваш задан сумбурно, тестовые данные приведены в непригодном для использования виде, требуемого результата не приведено вообще.
Вы сделали всё, чтобы отбить желание помогать вам...
30 май 18, 12:13    [21453312]     Ответить | Цитировать Сообщить модератору
 Re: Объединение строк  [new]
gigar
Member

Откуда:
Сообщений: 16
таблица price_list
price_list_numprice_list_clients_id
11
12


таблица clients
clients_idclients_name
1клиент 1
2клиент 2


Должно получиться :
price_list_numprice_list_name
1клиент 1 клиент 2


Запрос:
SELECT 
price_list.price_list_num,
stuff(( select ','+cast(clients_name as nvarchar) as 'data()' from clients
where clients.clients_id=price_list.price_list_clients_id
for xml path('') ),1,1,'')
FROM price_list
group by price_list_num,price_list_clients_id


Через данный запрос выводятся клиенты, но без группировки, как исправить?
30 май 18, 12:28    [21453390]     Ответить | Цитировать Сообщить модератору
 Re: Объединение строк  [new]
Щукина Анна
Member

Откуда:
Сообщений: 1467
gigar,

Рекомендации по оформлению сообщений в форуме, пункт 6, пример хорошего стиля
30 май 18, 12:34    [21453428]     Ответить | Цитировать Сообщить модератору
 Re: Объединение строк  [new]
buser
Member

Откуда: Санкт-Петербург
Сообщений: 4537
ну так что вам неясно? уберите из gb price_list_clients_id... пордулу с конкатенацией уберите в max
30 май 18, 13:47    [21453817]     Ответить | Цитировать Сообщить модератору
 Re: Объединение строк  [new]
gigar
Member

Откуда:
Сообщений: 16
Когда убираю price_list_clients_id из group
пишет ошибку:
Столбец "price_list.price_list_clients_id" недопустим в списке выбора, поскольку он не содержится ни в агрегатной функции, ни в предложении GROUP BY.
30 май 18, 13:57    [21453902]     Ответить | Цитировать Сообщить модератору
 Re: Объединение строк  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
На будущее, вот так выглядит правильно оформленный вопрос.
Правильно оформивший вопрос правильный ТС
Добрый день, коллеги!
Есть две таблицы:
DECLARE @price_list TABLE ( price_list_num INT, price_list_clients_id INT )
INSERT INTO @price_list
VALUES
  ( 11, 1 ),
  ( 11, 3 ),
  ( 11, 7 ),
  ( 12, 8 )
;
DECLARE @clients TABLE ( clients_id INT, clients_name VARCHAR(20) )
INSERT INTO @clients
VALUES
  ( 1, 'магазин 1' ),
  ( 3, 'магазин 2' ),
  ( 7, 'магазин 3' ),
  ( 8, 'магазин 4' )
;

Как сделать объединение строк в столбце название организации через запятую? Пробовал так:
...

А так - один из вариантов решения правильно оформленного вопроса.
SELECT 
  pl.price_list_num,
  [clients] = STUFF( ( 
    SELECT 
      [*] = N','+ CONVERT( nvarchar(max), [clients_name] )
    FROM
      @price_list plc
      INNER JOIN @clients cl ON (
            cl.[clients_id] = plc.[price_list_clients_id] )
    WHERE
      plc.[price_list_num] = pl.[price_list_num]
    FOR XML PATH('') ), 1, 1, '' )
FROM
  ( SELECT DISTINCT price_list_num FROM @price_list ) pl
30 май 18, 14:09    [21453953]     Ответить | Цитировать Сообщить модератору
 Re: Объединение строк  [new]
LameUser
Member

Откуда:
Сообщений: 2028
      
[*] = N','+ CONVERT( nvarchar(max), [clients_name] )

Если вам вдруг интересно - можно заменить на
concat(',',clients_name)
30 май 18, 14:48    [21454124]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить