0

嗨,我有一个关于连接列的问题。我有两张桌子。

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 查询中缺少什么?

4

2 回答 2

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 回答
0

假设您有 2 个表 SalesOrder 和 Product,其中 ProductID 作为“关系”列,您可以连接这两个表,然后使用“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 回答