2013-06-05 5 views
0

Привет, поэтому у меня есть вопрос о конкатенации столбца. У меня две таблицы.Конкатенация столбца в том же столбце в SQL Server

Table 1: Sales Order-> OrderID, ProductsOnHold (Should list product(s) on hold) 
Table 2: Products-> ProductID, OnHold (boolean) 
  • заказ клиента может иметь много продуктов.
  • Продукт может иметь трюм, который заставит заказ клиента быть приостановленным, если этот заказ имеет этот продукт.
  • Таким образом, заказ на продажу может быть приостановлен, если у вас есть 1 или несколько продуктов на удержании.

    Я смог получить один продукт для отображения, если заказ находится на удержании, , но что, если у него больше товаров в режиме ожидания - , как я могу их отобразить? Это для просмотра, которое я создаю.

Это то, что я сделал до сих пор:

(SELECT ProductName 
FROM Products with (NOLOCK) 
WHERE (OnHold = 1) AND (EXISTS 
    (SELECT CASE 
       WHEN (COUNT(DISTINCT Product)> 1) THEN (Product + ', ' + Product) 
       ELSE Product END AS ProductName 
    FROM SalesOrder WITH (NOLOCK) 
    GROUP BY OrderID))) AS ProductsOnHold 

Желаемая Выход:

OrderID | ProductsOnHold 
---------------------------------- 
    1 | P1, P2, P7      
    2 |     
    3 | P1    
    4 | P1, P7, P8, P9, P15, P77 

Все, что мне не хватает в моем SQL запросе?

+3

В принципе, вы хотите получить эквивалент функции MySQL, называемой GROUP_CONCAT. Есть много вопросов об этом: [Имитация функции group_concat MySQL в Microsoft SQL Server 2005?] (Http://stackoverflow.com/questions/451415/simulating-group-concat-mysql-function-in-microsoft-sql- сервер-2005). –

+0

У вас есть веская причина использовать 'nolock'? –

ответ

0

Если предположить, что у вас есть 2 таблицы SalesOrder и Product с ProductID в качестве столбца «отношения», вы можете присоединиться к этим двум таблицам, а затем перенести нас в разделе «для xml».

select s1.OrderID, 
stuff(
     (select ','+p.ProductName as [text()] 
     from SalesOrder s 
      join Product p on p.ProductID = s.ProductID and p.OnHold = true 
     where s.OrderID = s1.OrderID 
     group by p.ProductName 
     for xml path ('')) 
    ,1,1,'') as ProductsOnHold from SalesOrder s1 group by s1.OrderID 

Надеюсь, это поможет.

+0

Спасибо, что это определенно сработало! :) – CWOWW

0

Моего решение [Я не уверен, если я понимаю ваша проблему хорошо]

функций пользователя

create function inonerow (@orderid int) 
returns nvarchar(max) 
begin 
declare @data nvarchar(max) 
SELECT @data =coalesce(@data + ',','')+ CONVERT(varchar,prodid) from SalesOrder 
inner join product on product.prodid = salesorder.prodid where [email protected] and product.oshold = 1 
return @data 
end 

select distinct orderid, dbo.inonerow(orderid) from salesorder 
inner join product on product.prodid = salesorder.prodid 
where product.onhold = 1 

Надеется, что это работает :)

Смежные вопросы