【问题标题】:SQL Decrease field by the amount of previous record fieldSQL 将字段减少上一条记录字段的数量
【发布时间】:2016-12-15 16:27:17
【问题描述】:

我有一个提供一些库存结果的查询。该查询查看项目编号并与库存表连接并检索库存量 (InStock)

SUM(di.[Count])as Requested,
ISNULL(mt.qty,0) as InStock,

然后我得到的是这样的结果:

这是正确的,但我希望能够将 InStock 的金额减去之前记录的金额。

我尝试过的方法很明显,但没有奏效:

(ISNULL(mt.qty, 0) - SUM(di.[Count])) as Inventory,

我正在研究类似的东西,但之前从未使用过 Partition 或 Over :

sum(mt.qty) over (order by di.InventoryNumber asc) as Inventory

以下是我的完整查询:

SELECT ISNUll(mt.cart,'Not Assigned') as Cart,

                   c.ClientName AS Client,

                   di.InventoryNumber AS IMS_Number,

                   SUM(di.[Count])as Requested, 

                   ISNULL(mt.qty,0) as InStock,

                   (ISNULL(mt.qty, 0) - SUM(di.[Count])) as Inventory, 

                    CASE di.IsManual  
                       WHEN 0 THEN 'Auto'
                       WHEN 1 THEN 'Manual'
                     END As Operation,

                     CASE WHEN mt.item IS NULL THEN 'New' ELSE 'In Stock' END as Availability,

                     CASE jl.LocationId 
                        WHEN 0 THEN 'Both'
                        WHEN 1 THEN 'Bond'
                        WHEN 2 THEN 'Woodlands'
                     END AS Location,

                     CAST (di.ItemDescription AS TEXT) as Descriptions,
                     di.ItemType AS [Type]


                         FROM linwdc1f.eFulfillment2.dbo.DailyInventoryView di 

                          INNER JOIN linwdc1f.eFulfillment2.dbo.JobConfigs jc ON di.JobName=jc.JobName 
                          INNER JOIN linwdc1f.eFulfillment2.dbo.Clients c ON di.ClientId=c.ClientId 
                          INNER JOIN linwdc1f.eFulfillment2.dbo.JobLocations jl ON  jl.JobName = di.JobName AND jl.LocationId=2
                          LEFT OUTER JOIN linwdc1f.eFulfillment2.dbo.printjobs pj on pj.JobName =di.JobName
                          LEFT OUTER JOIN linwdc1f.eFulfillment2.dbo.PrintComponents pc on pc.id = pj.PrintComponentId
                          LEFT OUTER JOIN linwdc1f.eFulfillment2.dbo.ProjectJobs prj on prj.id = pc.ProjectJobId
                          LEFT OUTER JOIN Master mt on di.InventoryNumber = mt.item 

                        WHERE di.JobDate BETWEEN '2016-08-08' AND '2016-08-08'  AND prj.ProjectJobName IS NULL

                        GROUP BY c.ClientName, mt.cart, di.InventoryNumber,c.ClientName ,mt.qty,mt.item,jl.LocationId,di.ItemDescription,di.ItemType,di.IsManual
                        Order by di.InventoryNumber,c.ClientName, mt.cart

【问题讨论】:

  • 你探索过 Lag/Lead 吗?
  • 你有什么版本的sql-server?
  • 要利用滞后/领先优势,您需要一些东西来订购该数据。您是否有订单 ID 字段来订购您提供的示例数据?
  • Chris@ 2014 专业,是的,IMS_Number 字段是唯一的。
  • 根据您的说法,很难给出答案。您的问题需要对数据集进行某种排序,而您提供的数据集并没有给出产生这种排序的任何条件。

标签: sql-server tsql select sum


【解决方案1】:

我想您有一个像“RequestID”这样的列来标识您的请求表中的每条记录。请进行相应的修改。

确保您使用的是 SQL Server 2012 及更高版本,因为我使用了 LAG 函数,这是自 SS 2012 以来的新函数。经过测试,它在 SSMS 中完美运行。 :)

--Create table structure
create table #stock (IMS_Number varchar(10), InStocked int)
go

create table #request (requestID int identity(1,1), IMS_Number varchar(10), Requested int, RequestDate date)
go


--Insert into sample Data
insert #stock values ('H000092229', 3),('H111108880',8)

insert #request 
select 'H000092229', 2, '08-09-2016'
union all
select 'H000092229', 3, '08-09-2016'
union all
select 'H000092229', 3, '08-09-2016'
union all
select 'H000092229', 3, '08-09-2016'
union all
select 'H000092229', 1, '08-09-2016'

select * from #stock
select * from #request


--Below is the solution
select 
    IMS_number, 
    Requested, 
    case    when RID = 1 
            then instocked 
            else LAG(instockReal,1,0)over(order by requestid) 
    end as InStocked
from
(
    select  b.requestid, 
            a.instocked, 
            b.IMS_number, 
            b.requested, 
            sum(b.requested)over(partition by b.IMS_number order by b.requestid) * (-1) + a.instocked as instockReal,
            row_number()over(partition by b.ims_number order by requestid) as RID
    from #request b
    join #stock a
    on b.IMS_Number = a.IMS_Number
) as ab

顺便说一下,在目标结果集中,最后一条记录应该是-8而不是-6。

【讨论】:

  • Dance-Henry@ 谢谢它运行良好,除非库存为零。我认为如果库存为零,那么 instocked 将是 Requested value 的负数。这个我想我可以解决。再次感谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-13
  • 1970-01-01
  • 1970-01-01
  • 2011-01-07
  • 1970-01-01
相关资源
最近更新 更多