2016-07-29 26 views
0

Ich habe eine Tabelle, wie die nächste Zeile der vorherigen Zeile der Spalte Wert verwenden Spalte Wert für die Berechnung

 
Id | Aisle | OddEven | Bay | Size | Y-Axis 
3 | A1 | Even | 14 | 10 | 100 
1 | A1 | Even | 16 | 10 | 
6 | A1 | Even | 20 | 10 | 
12 | A1 | Even | 26 | 5 | 150 
10 | A1 | Even | 28 | 5 | 
11 | A1 | Even | 32 | 5 | 
2 | A1 | Odd  | 13 | 10 | 100 
5 | A1 | Odd  | 17 | 10 | 
4 | A1 | Odd  | 19 | 10 | 
9 | A1 | Odd  | 23 | 5 | 150 
7 | A1 | Odd  | 25 | 5 | 
8 | A1 | Odd  | 29 | 5 | 

wie diese

 
Id | Aisle | OddEven | Bay | Size | Y-Axis 
1 | A1 | Even | 14 | 10 | 100 
2 | A1 | Even | 16 | 10 | 110 
3 | A1 | Even | 20 | 10 | 120 
4 | A1 | Even | 26 | 5 | 150 
5 | A1 | Even | 28 | 5 | 155 
6 | A1 | Even | 32 | 5 | 160 
7 | A1 | Odd  | 13 | 10 | 100 
8 | A1 | Odd  | 17 | 10 | 110 
9 | A1 | Odd  | 19 | 10 | 120 
10 | A1 | Odd  | 23 | 5 | 150 
11 | A1 | Odd  | 25 | 5 | 155 
12 | A1 | Odd  | 29 | 5 | 160 

ich eine Auswahlabfrage und Update-Abfrage benötigen zu suchen. Was es tut sind bereits einige Y-Axis Number gefüllt (am Anfang der Odd/Even), dann muss ich den Wert der Y-Axis-Spalte der vorherigen Zeile nehmen und addiert die aktuelle Zeilengröße, die = zu aktuellen Y- Achse. Muss dies solange tun, bis eine andere Y-Achse den Wert hat, der die Berechnung überspringt und die nächste Zeile diese Nummer verwendet.

Mein Denkprozess ist dies:

Id auf jeden Fall verwendet werden, wird jedoch die Id ist nicht als Folge meinem Beispiel gezeigt

so brauche ich

ROW_NUMBER OVER (PARTITION BY Aisle haben , OddEven, Bay Sortieren nach Aisle, OddEven, Bay)

Dann eine Art die gleiche Tabelle JOIN aber die ON ist T1.RN = T2.RN - 1

Wo ich feststecke ist aber die erste Zeile hat keinen vorherigen Wert es wird versuchen diesen Wert zu aktualisieren.

Jeder hat eine Idee für SQL Query 2008 für Select und Update wird sehr geschätzt werden! Vielen Dank.

Antwort

1

Ein wenig schwieriger zu 2008, aber ich denke, das ist das, was Sie suchen

Declare @Table table (Id int,Aisle varchar(25),OddEven varchar(25),Bay int,Size int,[Y-Axis] int) 
Insert Into @Table values 
(3,'A1','Even',14,10 ,100), 
(1,'A1','Even',16,10 ,0), 
(6,'A1','Even',20,10 ,0), 
(12,'A1','Even',26,5,150), 
(10,'A1','Even',28,5,0), 
(11,'A1','Even',32,5,0), 
(2,'A1','Odd',13,10 ,100), 
(5,'A1','Odd',17,10 ,0), 
(4,'A1','Odd',19,10 ,0), 
(9,'A1','Odd',23,5,150), 
(7,'A1','Odd',25,5,0), 
(8,'A1','Odd',29,5,0) 

;with cteBase as (
     Select * 
      ,IDNew=Row_Number() over (Order By Aisle,Bay) 
      ,RowNr=Row_Number() over (Order By Aisle,OddEven,Bay) 
     From @Table 
) 
, cteGroup as (Select TmpRowNr=RowNr,GrpNr=Row_Number() over (Order By RowNr) from cteBase where [Y-Axis]>0) 
, cteFinal as (
       Select A.* 
         ,GrpNr = (Select max(GrpNr) from cteGroup Where TmpRowNr<=RowNr) 
       From cteBase A 
       ) 
Select ID=Row_Number() over (Order By A.OddEven,A.Bay) 
     ,A.Aisle 
     ,A.OddEven 
     ,A.Bay 
     ,A.Size 
     ,[Y-Axis] = Sum(case when B.[Y-Axis]>0 then B.[Y-Axis] else B.Size end) 
From cteFinal A 
Join cteFinal B on (B.RowNr<=A.RowNr and A.GrpNr=B.GrpNr) 
Group By 
     A.IDNew 
     ,A.Aisle 
     ,A.OddEven 
     ,A.Bay 
     ,A.Size 
Order By A.OddEven,A.Bay 

Returns

ID Aisle OddEven Bay Size Y-Axis 
1 A1  Even 14 10  100 
2 A1  Even 16 10  110 
3 A1  Even 20 10  120 
4 A1  Even 26 5  150 
5 A1  Even 28 5  155 
6 A1  Even 32 5  160 
7 A1  Odd  13 10  100 
8 A1  Odd  17 10  110 
9 A1  Odd  19 10  120 
10 A1  Odd  23 5  150 
11 A1  Odd  25 5  155 
12 A1  Odd  29 5  160 
+0

Amazing Code !!! –

+0

wäre nett, wenn Sie diese auch beantworten könnten: http://stackoverflow.com/questions/38731400/sql-accumulative-columns-sum-across-the-row –

+0

@DavidChen Ich werde einen Blick in 30 Minuten werfen –

2

Sie scheinen eine kumulative Summe zu wollen. Dies wäre in SQL Server 2012+ einfacher. Sie können dies in SQL Server 2008 tun outer apply mit:

select t.*, cume_value 
from t outer apply 
    (select sum(size) + sum(yaxis) as cume_value 
     from t t2 
     where t2.aisle = t.aisle and t2.oddeven = t.oddeven and 
      t2.bay < t.bay 
    ) t2; 
+0

Ist es in Betracht ziehen, wo es einige Y-Achse sind Nummer existiert bereits? Lassen Sie mich es versuchen, haben Sie auch eine Update-Abfrage? –

+0

scheint nicht zu funktionieren –

+0

@DavidChen. . . Wie funktioniert es nicht? –

0

Ich muss mein Computer verlassen, so aktualisieren Abfrage einfach sein sollte von hier aus zu bewegen.

Unten ist die Select-Abfrage;

select row_number() over (order by oddeven,bay) id, 
    Aisle, 
    OddEven, 
    Bay, 
    Size, 
    max(ISNULL([Y-Axis],0)) over (partition by Aisle, OddEven,Size order by bay) 
     + sum(CASE WHEN [Y-Axis] is null THEN Size ELSE 0 END) over (partition by Aisle,OddEven,size order by Bay) as [Y-Axis] 
from oddseven 
order by id 
+0

gibt mir einen Fehler: Die parallelen Data Warehouse (PDW) -Features sind nicht aktiviert –

Verwandte Themen