2016-06-29 71 views
1

我有一個像下面的查詢:減法 - 嵌套查詢SQL

select ISNULL(sum(fonhand),0.00) as 'Supply', 0 as 'Demand' 
from invoice where ptno = @ptno 
union 
select distinct a.quantity as 'Supply', 0 as 'Demand' 
from jbMstr a join jbDetails b on a.fjobno = b.fjobno 
    where a.ptno = @ptno AND a.status = 'RELEASED' AND fbmsource = 'S' 
union 
select 0 as 'Supply', ftotqty as 'Demand' 
from jbDetails a join jbMstr b on a.fjobno = b.fjobno 
where fbompart = @ptno and fstatus = 'RELEASED' AND fbmsource = 'S' 

輸出像以下:

Supply Demand  Avail 
-4.00000 0.0000000000 -4 
0.00000 1.0000000000  -5 
0.00000 1.0000000000  -6 
0.00000 4.0000000000  -10 
0.00000 -1.0000000000  -9 

在這裏,我想獲得新的欄目「庫存狀況」,它應該從每行的「需求」欄中減去。如何實現這一點?

任何人都可以幫助我做到這一點? 在此先感謝...

+0

標記使用的dbms。 (ISNULL()是特定於產品的功能。) – jarlh

+0

由於UNION刪除所有重複項,因此無需執行SELECT DISTINCT。 – jarlh

回答

1

使用運行總計把戲做到這一點

考慮到你有一列,以確定的順序

SELECT [supply], 
     [demand], 
     [avail] 
FROM Yourtable a 
     CROSS apply(SELECT Sum(supply - demand) AS [Avail] 
        FROM Yourtable b 
        WHERE a.id >= b.id) cs 

Sql Server 2012+您可以使用Sum() Over(Order by)窗函數來計算運行總和

SELECT [supply], 
     [demand], 
     Sum(supply - demand)OVER(ORDER BY id) as Avail, 
FROM Yourtable 
+0

謝謝你的回覆..我嘗試了第一個..但它不允許不能對包含聚合或子查詢的表達式執行聚合函數... – KaviSuja

+0

只是一個側面說明。根據[msdn](https://msdn.microsoft.com/en-us/library/ms187810.aspx),SUM()Over for 2008+工作。我在2008R2中使用過它。 – mxix

+0

@KaviSuja - 可以肯定的是這是你執行的查詢,因爲在我的查詢中包含聚合或子查詢的表達式上沒有聚合函數 –