2016-06-29 4 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

Не нужно делать SELECT DISTINCT, поскольку UNION удаляет все дубликаты. – 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

Просто боковое примечание. SUM() Заработает в течение 2008 года в соответствии с [msdn] (https://msdn.microsoft.com/en-us/library/ms187810.aspx). Я использовал его с 2008R2. – mxix

+0

@KaviSuja - уверен, что этот запрос вы выполнили, потому что в выражении, содержащем агрегат или подзапрос, присутствующий в моем запросе, нет агрегированной функции –

Смежные вопросы