1

サーバー2008のMS SQLで、1つのテーブルの行をクエリと結合しようとしています。このコードをここから取り出したと思います。これは私のニーズにほぼ合っていますが、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
SO番号 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  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 を使用して何を達成しようとしているのかを完全に理解しているとは思いません-サンプルに個別の値が1つしかないため、結果を確認するのが難しくなります-しかし、これにより近づくことができます

于 2012-07-10T17:16:43.377 に答える
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 に答える