@blainethemono

Как собрать данные в одну строку в ms sql?

Товарищи!
В таблицу Nakladnaya сваливаются данные из двух других:
000fa0da086341f9a01c28ae98889014.PNG

Есть Product, Zakaz и Nakladnaya, В одном заказе может быть несколько продуктов. В накладной хранятся ProductID и ZakazNomer.
4da13e44327349e38683c464cbdd8e78.PNG

Нужно сделать запрос, чтобы остался заказ и соответствующие ему продукты в одну строку через запятую, т.е. вот так:
z1 | Milk, Eggs, Bread
z2 | Milk
z3 | Bread

В sql умею только простенькие селекты, к сожалению...
Помогите, пожалуйста!
  • Вопрос задан
  • 24484 просмотра
Решения вопроса 1
@Noob_001
select 
z.Nomer,
(
   SELECT distinct Name + CHAR(10) FROM  #product p 
   where  p.ID in (select n.ProduktID from #nakladnaya n where n.ZakazNomer = z.Nomer) 
   FOR xml path('')
) 'names'
from #zakaz z
inner join #nakladnaya n on n.ZakazNomer = z.Nomer
group by z.Nomer

/* вместо #тбличка ... подставь свои таблицы, а далее жмякай F5 */
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
В mysql это выглядело бы так:
SELECT z.Nomer, GROUP_CONCAT(p.Name SEPARATOR ', ')
FROM Nakladnaya as n
INNER JOIN Product as p ON n.ProductID = p.ID
INNER JOIN Zakaz as z ON n.ZakazNomer = z.Nomer
GROUP BY z.Nomer

В ms sql, насколько я понимаю, group_concat нет, но есть какие-то способы его эмулировать. Возможно, есть еще какие-то специфические нюансы, но я в этом сомневаюсь.

P.S. Печатал эту смесь английского и транслита и плакал кровавыми слезами.
Ответ написан
Комментировать
@mletov
1) Через INNER JOIN подключаете к Nakladnaya таблицы Zakaz и Product

SELECT *
FROM Nakladnaya
INNER JOIN Zakaz
ON Nakladnaya.ZakazNomer=Zakaz.Nomer
INNER JOIN Product
ON Nakladnaya.ProductId=Product.ID


Полученную выборку складываете во временную таблицу, cte или куда удобно

2) Далее в гугле запрос "sql server 2008 group_concat"
Вот, например blog.shlomoid.com/2008/11/emulating-mysqls-groupco...
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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