1

我正在尝试将一个表中的行与我在服务器 2008 上的 MS SQL 中的查询结合起来。我相信我在这里取消了这段代码。这几乎符合我的需求,但它是对 SOPartsUsed 的序列号进行分组,但我需要它根据 tblServiceOrders.ProjectKeyID 进行分组。任何帮助将不胜感激我对 SQL 了解不多。我将在下面对我要完成的工作进行更详细的解释。

SELECT        
p1.ItemID, SerialNumbers AS SerialNumber 
FROM            
tblSOPartsUsed p1 INNER JOIN
tblServiceOrders p2 ON p1.SONumber = p2.SONumber
    CROSS APPLY
       (SELECT        
        stuff
           ((SELECT ',' + p3.SerialNumber
             FROM tblSerialNumbers p3
             WHERE p3.FKSOPartsUsed = p1.SOPartsUsedKeyID
             ORDER BY SerialNumber FOR XML PATH(''), TYPE ).value('.', 'varchar(max)'), 1, 1, '')
    ) D (SerialNumbers)
 WHERE        (p1.QuantityFilled > 0) AND (p2.ProjectKeyID = 385)
 GROUP BY p1.ItemID, SerialNumbers, p2.ProjectKeyID
 ORDER BY p1.ItemID

我有一个带有序列号的表格,一个带有服务订单上使用的零件的表格和一个服务订单表格。

tblSerialNumbers -> tblSOPartsUsed -> tblServiceOrders

tblSerialNumbers
itemID SerialNumber FKSOPartsUsed
1 1444 233
1 1555 234
1 1666 236

1 1999 237
1 1888 238

1 2222 239
1 2121 240

tblSOPartsUsed
itemID SOPartsUsed SONumber QuantityFilled
1 233 SO544 5
1 234 SO544 7
1 236 SO544 7
1 237 SO577 7
1 238 SO577 7

1 239 SO581 7
1 240 SO580 7

tblServiceOrders
SOnumber ProjectKeyID
SO544 PJ366
SO577 PJ366
SO580 PJ111
SO581 PJ111

我想要什么
itemID ProjectKeyID SerialNumber
1 PJ366 1444,1555,1666,1999,1888

我得到什么
itemID ProjectKeyID SerialNumber
1 PJ366 1444,1555,1666
1 PJ366 1999,1888

我正在尝试通过在 tblServiceOrders 中找到的 ProjectKeyID 对序列号和项目 ID 进行分组。现在上面的查询有效,但它正在对 tblSOPartsUsed 上的 ItemID 进行分组,并希望在 ProjectKeyID 上进行分组。

谢谢你的帮助。

4

2 回答 2

0

试试这个

SELECT        
p1.ItemID, p2.ProjectKeyID,D.SerialNumbers AS SerialNumber 
FROM            
tblSOPartsUsed p1 INNER JOIN
tblServiceOrders p2 ON p1.SONumber = p2.SONumber
CROSS APPLY
   (SELECT        
    stuff
       ((SELECT ',' + p3.SerialNumber
         FROM tblSerialNumbers p3
         WHERE p3.ItemID = p1.ItemID
         ORDER BY SerialNumber FOR XML PATH(''), TYPE ).value('.', 'varchar(max)'), 1, 1, '')
) D (SerialNumbers)
WHERE        (p1.QuantityFilled > 0) AND (p2.ProjectKeyID = 'PJ366')
GROUP BY p1.ItemID, p2.ProjectKeyID, SerialNumbers 
ORDER BY p1.ItemID
于 2012-07-10T00:17:36.053 回答
0
SELECT  itemID ,
    ProjectKeyID ,
    ( SELECT    SerialNumber + ', ' AS 'data()'
      FROM      dbo.tblSOPartsUsed u
                JOIN tblSerialNumbers nbr ON u.SOPartsUsed = nbr.FKSOPartsUsed
      WHERE     SONumber IN ( SELECT    SOnumber
                              FROM      dbo.tblServiceOrders
                              WHERE     ProjectKeyID = tso.ProjectKeyId )
                AND itemID = tso.itemID
    FOR
      XML PATH('')
    )
FROM    ( SELECT DISTINCT
                c.itemID ,
                ProjectKeyId
      FROM      dbo.tblServiceOrders a
                JOIN dbo.tblSOPartsUsed b ON a.SOnumber = b.SONumber
                JOIN dbo.tblSerialNumbers c ON b.SOPartsUsed = c.FKSOPartsUsed
    ) tso

我认为我不完全理解您要使用 itemID 完成的工作 - 样本中只有一个不同的值使得验证结果变得困难 - 但这可能会让您更接近

于 2012-07-10T17:16:43.377 回答