2016-09-20 1 views
0

Ich versuche, an einer Logik zu arbeiten, die ich nicht scheinen kann, um einen Weg zu finden, es zu tun. Problem: Ich habe drei Säulen PrimaryKey, col1 und col2 als Screenshot unten eine neue Spalte nehmen enter image description hereSubtrahiere zwei Spalten (Col1-Col2) und füge Rest zur nächsten Zeile in Col1 hinzu

ist in gezeigt Lassen Col3 = Col1-Col2,

ich die restlichen in Col3 zu Col1 bin Hinzufügen von nächste Zeile und subtrahiere sie erneut, um Col3 zu erhalten.

Lassen Sie uns die Tabelle oben und für

PrimaryKey = 1 betrachten -> Col3 = 10,2-5 = 5,2.

Diese 5.2 muss zu Col1 von PrimaryKey = 2 hinzugefügt werden, was 15 + 5.2 = 20.2 ist.

Jetzt wieder Col3 = 20,2 - 3 = 17,2, so muss es für die nächsten Datensätze iterieren.

Ich hoffe, dass ich klar genug bin, mein Problem zu erklären. Bitte lassen Sie mich wissen, wenn Sie weitere Erklärungen benötigen.

* Die angegebene Tabelle ist nur eine Beispieltabelle, die tatsächliche Tabelle, die ich arbeite, ist sehr groß.

Vielen Dank.

+0

Sie bitte Ihre Frage bearbeiten und die Ergebnisse zeigen, vorzugsweise als Text Tabelle –

Antwort

1

Soweit ich sagen kann, möchten Sie den kumulativen Wert von col2 subtrahiert von der kumulativen von col1. In SQL Server 2012+, würden Sie:

select t.*, 
     sum(col2 - col1) over (order by primary key) 
from t; 
0

Sie eine Selbstverknüpfung auf der ursprünglichen Tabelle verwenden können, aber es gibt eine Gefahr, wenn der Primärschlüssel nicht vollständig, wie aus Löschen von Datensätzen an einem gewissen Punkt ist . Hier verwende ich einen Self-Join mit ROW_NUMBER, um einen definitiv sequentiellen Schlüssel zu erstellen - dies erlaubt mir, [diese Zeilennummer] mit [dieser Zeilennummer + 1] zu verbinden (Beispieldaten enthalten, falls jemand andere eine bessere Methode hat):

DECLARE @YourTable TABLE (PrimaryKey INT IDENTITY(1,1), COL1 FLOAT, COL2 FLOAT) 
INSERT INTO @YourTable 
     (COL1, COL2) 
VALUES 
     (10.2, 5.0) 
    , (15.0, 3.0) 
    , (5.7, 6) 
    , (9.0, 5.5) 

; WITH TableRanked 
AS (
    SELECT PrimaryKey , 
      COL1 , 
      COL2 
      , COL3 = COL1 - COL2 
      , RowNum = ROW_NUMBER() OVER(ORDER BY PrimaryKey) 
    FROM @YourTable 
    ) 
SELECT tr.PrimaryKey , 
     tr.COL1 , 
     tr.COL2 , 
     tr.COL3 
     , COL1Next = COALESCE(trNext.COL1, 0) 
     , COL4 = tr.COL3 + COALESCE(trNext.COL1, 0) 
FROM TableRanked tr 
    LEFT JOIN TableRanked trNext 
     -- Here's where the magic happens: 
     ON trNext.RowNum = (tr.RowNum + 1) 
0

Wenn Sie SQL Server 2012 verwenden, können Sie LEAD verwenden. Diese erhalten Sie die gleichen Ergebnisse wie das, was Russel geschrieben, aber mit einer besseren Leistung:

DECLARE @YourTable TABLE (PrimaryKey INT IDENTITY(1,1), COL1 FLOAT, COL2 FLOAT) 
INSERT INTO @YourTable (COL1, COL2) 
VALUES (10.2, 5.0), (15.0, 3.0), (5.7, 6), (9.0, 5.5); 

SELECT *, (COL1 - COL2) + LEAD(COL1,1,0) OVER (ORDER BY PrimaryKey) 
FROM @YourTable; 
0

Lassen Sie mich wissen, ob diese Abfrage hilft:

DECLARE @n int 
SELECT @n = count(*) from @yourTable 
DECLARE @counter int 
SELECT @counter = MIN(PrimaryKeyCol) from @yourTable 
DECLARE @col3 = 0 

WHILE (@counter <= @n) 
SELECT @col3 = @col3 + Col1 - Col2 from @yourTable where PrimaryKeyCol = @counter 
Print @col3 
@counter = @counter + 1 
END 
Verwandte Themen