2016-06-29 73 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 - 可以肯定的是这是你执行的查询,因为在我的查询中包含聚合或子查询的表达式上没有聚合函数 –