2012-11-11 36 views
-1

比方說,我有一個表table1結構如下:你會如何使用SQL Server 2005來做到這一點?

id date v1 v2 v3 v4 ... vn 
    ------------------------------ 
    1 03 Y N 89 77 ... x 
    1 04 N N 9 7 ... i 
    1 05 N Y 6 90 ... j 
    1 06 N Y 9 34 ... i 
    1 07 N Y 0 88 ... i 
    2 03 N N 9 77 ... f 
    2 04 Y Y 90 7 ... y 
    2 05 Y N 6 90 ... v 
    2 06 N Y 9 34 ... i 
    2 07 N N 10 88 ... i 

正如你可能會看到,該表中,每個ID五行。我想要創建兩個新列:

-summarystory:=此變量是計算日期在0507之間的那些行,並且是最後三行的變量v3的總和。

讓我來解釋這更好的:前兩行(date 03和04)必須有NULL值,但有date=05該行的最後三個v3值的總和,即,89+9+6=104。同樣,具有date=06的行必須等於9+6+9=24。這必須爲每個ID和每個日期完成。

這是所期望的結果:

id date v3 summarystory 
    ------------------------- 
    1 03 89  NULL 
    1 04 9  NULL 
    1 05 6  104 
    1 06 9  24 
    1 07 0  15 
    2 03 9  NULL 
    2 04 90  NULL 
    2 05 6  105 
    2 06 9  105 
    2 07 10  25 
  • VcountYN:= Y的每行(僅基於變量v1v2)的數目。所以。例如,對於第一行,它將是VcountYN = 1。必須爲所有行計算此變量。

任何幫助,非常感謝。

+0

顯示沒有嘗試。 –

回答

2

下面介紹如何進行計算。把它變成新的表被作爲一個練習:

-- SQL 2012 version 
Select 
    t.id, 
    t.[date], 
    Case When [Date] Between 5 And 7 Then 
    Sum(v3) over (
     partition by 
     id 
     order by 
     [date] 
     rows between 
     2 preceding and current row 
    ) Else Null End, 
    Case When v1 = 'Y' Then 1 Else 0 End + 
    Case When v2 = 'Y' Then 1 Else 0 End 
From 
    table1 t; 

-- SQL 2005 version 
Select 
    t1.id, 
    t1.[date], 
    Case When t1.[date] Between 5 And 7 Then t1.v3 + IsNull(t2.v3, 0) + IsNull(t3.v3, 0) Else Null End, 
    Case When t1.v1 = 'Y' Then 1 Else 0 End + 
    Case When t1.v2 = 'Y' Then 1 Else 0 End 
From 
    table1 t1 
    Left Outer Join 
    table1 t2 
    On t1.id = t2.id and t1.[date] = t2.[date] + 1 
    Left Outer Join 
    table1 t3 
    On t2.id = t3.id and t2.[date] = t3.[date] + 1 

http://sqlfiddle.com/#!6/a1c45/2