0

こんにちは、列の連結について質問があります。私は2つのテーブルを持っています。

Table 1: Sales Order-> OrderID, ProductsOnHold (Should list product(s) on hold)
Table 2: Products-> ProductID, OnHold (boolean)
  • 販売注文には多くの製品を含めることができます。
  • 製品を保留にすることができます。これにより、その注文にその製品が含まれている場合、受注が保留になります。
  • そのため、1 つ以上の製品が保留中の場合、販売注文を保留にすることができます。

    注文が保留中の場合は 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クエリに欠けているものはありますか?

4

2 に答える 2

0

"relationship" 列として ProductID を持つ 2 つのテーブル SalesOrder と Product があると仮定すると、これら 2 つのテーブルを結合し、"for 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

お役に立てれば。

于 2013-06-05T19:13:07.127 に答える
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 orderid=@orderid 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

これがうまくいくことを願っています:)

于 2013-06-05T18:01:10.517 に答える