2016-04-08 11 views
-2

をSQL場合:複数の行の行は、私は次のクエリを持っている2

SELECT dbo.SalesOrder.SalesOrderID, dbo.SalesOrder.SalesOrderNo, dbo.SalesOrder.SubTotal, dbo.PO.PONo 
FROM dbo.SalesOrder 
LEFT OUTER JOIN dbo.PO ON dbo.SalesOrder.SalesOrderID = dbo.PO.SalesOrderID 

これは、受注のリスト、彼らの小計および接続されたPOのを示しています。同じ販売注文に複数のpoが接続されている場合は、すべてのPOラインの小計が返されます。その受注の最初の行に小計のみを表示します。

example data

+0

あなたは(基本的に主キーと外部キー)テーブル構造を共有することはでき – Ravi

+0

ショーあなたが今何を得ると何をしたいのですか –

答えて

0

は、SQL Server 2012上にある場合は、前の行で値を比較するLAGを使用することができます。前の行と値を比較するためにこれを使用します。SalesOrderIDPreviousSalesOrderIDを比較して、SubTotalの列を記入してください。

ソリューション:

SELECT SalesOrder.SalesOrderID, SalesOrder.SalesOrderNo, t1.PONo, 
(CASE 
    WHEN (t1.PreviousSalesOrderID IS NULL) OR (t1.PreviousSalesOrderID <> SalesOrder.SalesOrderID) THEN SalesOrder.SubTotal 
END) as SubTotal 
FROM (SELECT SalesOrder.SalesOrderID, PurchaseOrder.PONo, 
    LAG(SalesOrder.SalesOrderID) OVER (ORDER BY SalesOrder.SalesOrderID) AS PreviousSalesOrderID 
    FROM SalesOrder LEFT OUTER JOIN PurchaseOrder ON SalesOrder.SalesOrderID = PurchaseOrder.SalesOrderID) AS t1 
LEFT OUTER JOIN SalesOrder ON SalesOrder.SalesOrderID = t1.SalesOrderID 


出力(あなたの期待される出力と同じ):

SalesOrderID SalesOrderNo PONo SubTotal 
8    S00008   p7  1544 
9    S00009   p8  1644 
9    S00009   p262 NULL 
10    S00010   p263 4922 
10    S00010   p9  NULL 
11    S00011   p10  7805 
+0

GROUP BYグループ全体をグループ化したいのですが、それぞれの行を別々にしたいのですが、小計行はそのIDの最初の行にのみ表示します – khenry

+0

私はSQL Server 2008しか持っていません。 2008年に相当する? – khenry

+0

これは可能です:[SQL Server 2008のLAGとLEAD](https://sqlscope.wordpress.com/2014/05/26/lag-and-lead-for-sql-server-2008/) – Antony

関連する問題