2017-12-11 4 views
0

Ich habe die folgende Tabelle, die Daten für Kaufmenge, Preis usw. enthält. Ich muss den laufenden Durchschnitt (aktueller Durchschnitt) für jede Zeile berechnen.SQL Berechnen Laufender Durchschnitt

Der erste currentAverage-Wert für Empfang 1 beträgt £ 75, da 500 Einheiten zu £ 75 gekauft wurden. es gab keine früheren Einheiten, so dass die erste mit (PurchaseQty * IntakeSellingPrice)/IntakeSellingPrice = CurrentAvg

I wurden durch "£ 79,4858" mit dem folgenden Verfahren manuell berechnete Quittung berechnet wird 2 bis:

* select *, ((PurchaseQty * IntakeSellingPrice) + (InventoryBalance *))/New Balance [CurrentAVG] *

CREATE TABLE [dbo].[X](
[Item No_] [nvarchar](20) NOT NULL, 
[ReceiptNo] [bigint] NULL, 
[Sold] [decimal](38, 20) NULL, 
[InventoryBalance] [decimal](38, 20) NOT NULL, 
[PurchaseQty] [decimal](38, 20) NULL, 
[IntakeSellingPrice] [decimal](38, 20) NULL, 
[NewBalance] [decimal](38, 20) NULL, 
[CurrentAverage] [numeric](2, 2) NOT NULL 
) ON [PRIMARY] 
GO 

INSERT [dbo].[X] ([Item No_], [ReceiptNo], [Sold], [InventoryBalance], [PurchaseQty], [IntakeSellingPrice], [NewBalance], [CurrentAverage]) VALUES (N'2000045', 1, CAST(0.00000000000000000000 AS Decimal(38, 20)), CAST(0.00000000000000000000 AS Decimal(38, 20)), CAST(500.00000000000000000000 AS Decimal(38, 20)), CAST(75.00000000000000000000 AS Decimal(38, 20)), CAST(500.00000000000000000000 AS Decimal(38, 20)), CAST(0.00 AS Numeric(2, 2))) GO 
INSERT [dbo].[X] ([Item No_], [ReceiptNo], [Sold], [InventoryBalance], [PurchaseQty], [IntakeSellingPrice], [NewBalance], [CurrentAverage]) VALUES (N'2000045', 2, CAST(250.00000000000000000000 AS Decimal(38, 20)), CAST(250.00000000000000000000 AS Decimal(38, 20)), CAST(2181.00000000000000000000 AS Decimal(38, 20)), CAST(80.00000000000000000000 AS Decimal(38, 20)), CAST(2431.00000000000000000000 AS Decimal(38, 20)), CAST(0.00 AS Numeric(2, 2))) GO 
INSERT [dbo].[X] ([Item No_], [ReceiptNo], [Sold], [InventoryBalance], [PurchaseQty], [IntakeSellingPrice], [NewBalance], [CurrentAverage]) VALUES (N'2000045', 3, CAST(316.00000000000000000000 AS Decimal(38, 20)), CAST(2115.00000000000000000000 AS Decimal(38, 20)), CAST(10.00000000000000000000 AS Decimal(38, 20)), CAST(80.00000000000000000000 AS Decimal(38, 20)), CAST(2125.00000000000000000000 AS Decimal(38, 20)), CAST(0.00 AS Numeric(2, 2))) 
+0

Die Antwort hängt von Ihrer Datenbank-Engine ab, die Sie nicht angegeben haben. –

+0

Welches DBMS ist das ???? Bitte markieren Sie richtig, wenn Sie Hilfe benötigen. – Eric

+0

Dies ist für tsql 2012 sql server – user3266033

Antwort

0

Sie können jede Zeile mit allen anderen Reihen verbinden, die in dem laufenden Durchschnitt, bevor sie kommen, und dann dessen Durchschnitt von gruppiert finden die ehemalige Reihe. Angenommen, dass keine 2 Zeilen identisch sind, funktioniert das folgendermaßen:

SELECT a.*, AVG(b.CurrentAverage) 
FROM dbo.X a INNER JOIN dbo.X b 
ON a.[Item No_] >= b.[Item No_] --or whatever you are ordering your records by for the running average 
GROUP BY a.[Item No_], ..., a.[CurrentAverage] 
+0

Angenommen, es gibt mehrere Elemente und in jedem Element gibt es mehrere Empfänger. Beispiel: Artikel 0001 hat 4 Empfänger und Artikel 0002 hat 7 Belege. Würde das noch funktionieren? – user3266033

+0

@ user3266033 Wie bestellen Sie den laufenden Durchschnitt? Ich werde meine Antwort aktualisieren, um genauer zu sein – zambonee

+0

Es wird von itemno und der Empfängernummer bestellt – user3266033

Verwandte Themen