2016-08-09 22 views
0

Ich habe eine Abfrage, die einige Inventarergebnisse liefert. Die Abfrage schaut auf die Artikelnummer und mit einem Join zu aa Bestandstabelle und ruft die Menge auf Lager (InStock)SQL-Reduzierungsfeld um den Betrag des vorherigen Datensatzfelds

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

Was bekomme ich dann ein Ergebnis wie folgt aus:

enter image description here

Was aber korrekt ist, was ich gerne tun kann, ist die InStock der Betrag um den Betrag aus dem vorherigen Datensatz zu verstoßen.

enter image description here

Was ich habe versucht, und aus offensichtlichen Grund, warum dies nicht funktioniert:

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

Ich suche in so etwas wie dieses, aber nie Partition verwendet oder Over vor:

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

unten ist meine vollständige Abfrage:

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 
+1

Haben Sie Lag erforscht/Blei? – dfundako

+0

Welche Version von SQL-Server haben Sie? –

+2

Um Verzögerungen zu nutzen, brauchen Sie etwas, um diese Daten zu bestellen. Verfügen Sie über ein Bestell-ID-Feld, um die von Ihnen bereitgestellten Beispieldaten zu bestellen? –

Antwort

1

Ich nehme an, Sie haben eine Spalte wie "RequestID", um jeden Datensatz in Ihrer Anforderungstabelle zu identifizieren. Nehmen Sie die Änderung bitte entsprechend vor.

Stellen Sie sicher, dass Sie SQL Server 2012 und höher verwenden, da ich die LAG-Funktion verwendet habe, die seit SS 2012 eine neue Funktion ist. Getestet funktioniert es perfekt in 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 

Durch die Art und Weise, in der Ziel-Ergebnismenge, sollte der letzte Datensatz seine -8 anstelle von -6.

enter image description here

enter image description here

+0

Dance-Henry @ Danke, es funktioniert gut, außer wenn der Vorrat Null ist. Ich dachte, wenn der Bestand Null wäre, wäre der Vorrat der negative Wert des Angeforderten Wertes. Das denke ich kann ich beheben. danke nochmal – Mike

+0

ich finde dank nochmal dank – Mike

+0

bist du mehr als willkommen. :) –

Verwandte Themen