2017-12-20 1 views
2

ich ein Stück Code benötigen, die durch Zeile Basen die aktuelle durchschnittliche Zeilen berechnet mit dem Empfang beginnen 1.berechnen Durchschnitt in einer rekursiven SQL Server ausgeführt wird CTE

Ich habe die untenstehende Tabelle, die Daten für die Abnahmemenge enthält, Preis usw. Ich muss den laufenden Durchschnitt (aktueller Durchschnitt) für jede Zeile beginnend mit dem Empfang 1 berechnen. Der Empfang ist immer einfach, weil der vorherige Preis seinen Durchschnitt nicht beeinflusst.

Sobald Sie Durchschnitt 1 (£ 75) haben, können Sie dies verwenden, um die folgenden Zeilen zu berechnen.

Ich habe den Beleg 2 manuell als "£ 79.4858" berechnet. Mir wurde empfohlen, den CTE rekursiv zu verwenden.

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))), 
     (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))), 
     (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

Sie müssen den laufenden Mittelwert der 'IntakeSellingPrice' Spalte, Recht? – gotqn

+0

Durchschnitt von was? Sie haben angegeben, dass die Spalte "Durchschnitt" für die Spalte "£ 79.48" und der Durchschnitt für "Recept" 1 "£ 75" ist. Welche Zahlen verwendest du dafür? Der Durchschnitt von £ 75.00 und £ 80.00 ist £ 77.50. – Larnu

Antwort

1

Ich bin nicht sicher, aber Sie suchen avg wie wie unten mit Hilfe von lag() Funktion

select [Item No_],ReceiptNo,((PurchaseQty * IntakeSellingPrice) + 
      (InventoryBalance * isnull(lag(IntakeSellingPrice) over (order by [Item No_]), IntakeSellingPrice) 
      ))/NewBalance [RunningAVG] 
from X 

Ergebnis läuft:

Item No_ ReceiptNo RunningAVG 
2000045  1   75.000000 
2000045  2   79.485808 
2000045  3   80.000000 
+0

Ich kann Ihnen nicht genug danken. Ausgezeichnete Arbeit :) – user3266033

1

Verwenden Sie einfach die kumulativen Durchschnitt:

select x.*, 
     avg(?) over (order by [Item No_]) as running_avg 
from dbo.x; 

Die ? ist für die Spalte, die Sie interessieren. Ich kann nicht sagen, für was Sie den laufenden Durchschnitt wollen.

SELECT * 
     ,AVG([IntakeSellingPrice]) OVER (ORDER BY [Item No_] ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) 
FROM [dbo].[X] 

Mit einer OVER Klausel und die ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW wird führt die Summe über die alle Spalten von Anfang an in der aktuellen Zeile, in Reihen geordnet durch die ORDER BY Klausel:

1

Es soll so etwas wie diese.